我将哪些值传递给 SQLConfigDataSource 的 Attributes 参数来为 Microsoft Paradox 驱动程序创建系统 DSN

Posted

技术标签:

【中文标题】我将哪些值传递给 SQLConfigDataSource 的 Attributes 参数来为 Microsoft Paradox 驱动程序创建系统 DSN【英文标题】:What values do I pass to the Attributes parameter of SQLConfigDataSource to create a system DSN for the Microsoft Paradox Driver 【发布时间】:2013-10-15 19:08:38 【问题描述】:

我正在尝试以编程方式为 Microsoft Paradox 驱动程序 (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:\Users\Public\Documents\RAD Studio\12.0\Samples\Data'#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;

我最初在这里报告了答案,但 warrenp 和 crefird 都建议我回答我自己的问题(即使归功于 crefird)。你会在下面找到我的答案。

【问题讨论】:

你看过connectionstrings.com/microsoft-paradox-driver-odbc 感谢您的建议。我已经查看并尝试使用它们出现在那里的名称,但还没有运气。但我认为你走在了正确的轨道上,我会再强调一下。 cfird!就是这样。请将您的建议作为答案发布,我会将其标记为正确。我将编辑我的问题以解释我的发现。 我认为您有理由回答自己的问题,因为结果会更具可读性。真实的答案比链接更好 我同意@WarrenP 【参考方案1】:

已找到解决方案。 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('Software\Wow6432Node\ODBC\ODBC.INI\' +
                              DataSourceName);
  finally
    Registry.Free;
  end;
end;

【讨论】:

以上是关于我将哪些值传递给 SQLConfigDataSource 的 Attributes 参数来为 Microsoft Paradox 驱动程序创建系统 DSN的主要内容,如果未能解决你的问题,请参考以下文章

当我将变量中的值传递给 JSON 代码时它不起作用但是如果我硬编码它在 PHP 中的值

关于将值传递给方法的困惑? [复制]

如何将不同的值传递给管道参数

无法将 json 值传递给函数

将值传递给多个函数

将配置值传递给twig