我应将哪些值传递给 SQLConfig数据源的属性参数,以便为Microsoft悖论驱动程序创建系统 DSN



我正在尝试以编程方式为Microsoft悖论驱动程序(ODBC)添加系统DSN,但我找不到有关需要在SQLConfigDataSource的属性参数中传递的键的任何文档。我可以成功地添加MS Access系统DSN,但那是因为有许多示例包含密钥(例如DBQ)。我的代码(Delphi)不起作用,如下所示。

我尝试了大量不同的键,但没有成功。例如,我检查了出现在 HKEY_LOCAL_MACHINE\Software\Wow6432Node\ODBC\ODBC 下的名称/值对。注册表中的 INI(32 位 ODBC),但这并没有导致解决方案。

有谁知道我需要在SQLConfigDataSource的lpszAttributes参数中传递哪些键才能以编程方式创建Paradox系统DSN?

function SQLConfigDataSource (
    hwndParent:     SQLHWnd;
    fRequest:       WORD;
    lpszDriver:     PChar;
    lpszAttributes: PChar
  ): SQLBOOL; {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
  external 'odbccp32.dll' name 'SQLConfigDataSourceW';
procedure TForm1.Button1Click(Sender: TObject);
var
  Attributes: string;
  RetVal: Boolean;
begin
  Attributes := 'DSN=' + 'Paradox Data#0;
  Attributes := Attributes + 'DESCRIPTION=Paradox DSN for sample data'#0;
  Attributes := Attributes + 'DEFAULTDIR=c:UsersPublicDocumentsRAD Studio12.0SamplesData'#0#0;
  RetVal := SqlConfigDataSource(0, ODBC_ADD_SYS_DSN, 'Microsoft Paradox Driver (*.db)', PChar(Attributes));
  if not RetVal then
    ShowMessage('Could not add DSN');
end;

最初在这里报告了答案,但沃伦普和克雷菲德都建议我回答我自己的问题(即使功劳归于克雷菲德)。你会在下面找到我的答案。

解决方案已经找到。 Crefird 在这个问题的第一条评论中发布了指向 Paradox ODBC 驱动程序连接字符串的链接,并且使用在那里找到的名称,我能够创建 ODBC 系统 DSN(数据源名称)。

我最初的尝试已经很接近了,但你不会相信缺少什么。我的驱动程序名称不完全正确。在上面的代码中,我输入了驱动程序名称,如下所示

'Microsoft Paradox Driver (*.db)'

正确的驱动程序名称是

'Microsoft Paradox Driver (*.db )'

是的,关闭参数之前的额外空格实际上是正确的驱动程序名称。哇!

以下是我最终编写的两个动态创建DSN的例程:

implementation
uses Registry,  Winapi.Windows, System.SysUtils;
const
  ODBC_ADD_SYS_DSN    = 4;  // add a system DSN
function SQLConfigDataSource( hwndParent: LongWord ; fRequest: Word ;
  lpszDriver: PChar ; lpszAttributes: pchar ): boolean;
  stdcall; external 'ODBCCP32.DLL' name 'SQLConfigDataSourceW';
procedure CreateParadoxDSN(DataSourceName: string; DataDirectory: string);
var
  Attributes: string;
  RetVal: Boolean;
  DriverName: PChar;
  DirName: string;
begin
  DriverName := 'Microsoft Paradox Driver (*.db )';
  Attributes := 'DSN=' + DataSourceName + #0;
  Attributes := Attributes + 'DefaultDir=' + DataDirectory + #0;
  Attributes := Attributes + 'Dbq=' + DataDirectory + #0;
  Attributes := Attributes + 'UID='#0;
  Attributes := Attributes + 'Fil=Paradox 5.0'#0#0;
  Attributes := Attributes + 'DESCRIPTION=' + DataSourceName + #0#0;
  RetVal := SqlConfigDataSource(0, ODBC_ADD_SYS_DSN, DriverName,
                                PChar(Attributes));
  if not RetVal then
  begin
    Exception.Create('Failed to create data source name. Cannot continue');
  end;
end;
function ParadoxDSNExists(DataSourceName: string): Boolean;
var
  Registry: TRegistry;
begin
  Registry := TRegistry.Create;
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    Result := Registry.KeyExists('SoftwareWow6432NodeODBCODBC.INI' +
                              DataSourceName);
  finally
    Registry.Free;
  end;
end;

相关内容

  • 没有找到相关文章

最新更新