我正在尝试以编程方式为Microsoft Paradox驱动程序(ODBC)添加系统DSN,但我找不到有关我需要在SQLConfigDataSource的attributes参数中传递的密钥的任何文档。我可以成功添加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)。你会在下面找到我的答案。
答案 0 :(得分:2)
已找到解决方案。 crefird在此问题的第一条评论中发布了Paradox ODBC驱动程序连接字符串的链接,并使用在那里找到的名称,我能够创建ODBC系统DSN(数据源名称)。
我最初的尝试很接近,但你不会相信遗漏的东西。我没有完全正确的驱动程序名称。在上面的代码中,我输入了驱动程序名称
'Microsoft Paradox Driver (*.db)'
正确的驱动程序名称是
'Microsoft Paradox Driver (*.db )'
是的,关闭paren之前的额外空间实际上是正确的驱动程序名称。哇!
以下是我最后编写动态创建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;