【发布时间】:2016-07-13 17:07:08
【问题描述】:
我发现这个讨论帖可以追溯到 2004 年:
它展示了如何在不直接进入注册表的情况下检索 DSN 条目列表。
到目前为止,Delphi 没有问题。顺便说一句,我在 Windows 7 上使用 Delphi 2007。
现在,我只想选择引用 MS Access 数据库的条目,所以我尝试在示例中只添加几行。
首先我声明了这一点:
function SQLGetPrivateProfileString(
lpszSection, lpszEntry, lpszDefault, lpszRetBuffer: PChar;
cbRetBuffer: Integer;
lpszFilename: PChar): integer; stdcall;
并且正在实施中:
function SQLGetPrivateProfileString; external 'odbccp32.dll' name 'SQLGetPrivateProfileString';
然后我在示例中间的某处添加了以下行:
Result := SQLGetPrivateProfileString('ODBC Data Sources', Buffer1, 'Driver', RetBuf, 100, 'odbc.ini');
将RetBuf 声明为PChar。
我能够检索驱动程序字符串,如注册表中 ODBC 下所示。调用 GetMem 和 FreeMem 来初始化和清理 RetBuf 似乎对保持我的程序稳定至关重要。
我的问题是:如何检索所涉及的*.MDB 文件(或*.ACCDB 文件)的路径。我试过这个无济于事:
SQLGetPrivateProfileString(nil, Buffer1, 'DBQ', RetBuf, 128, 'odbc.ini')
当然,我对SQLGetPrivateProfileString() 函数的一个好的替代方案很感兴趣。
任何帮助将不胜感激。
附:我在“comp.lang.pascal.delphi.databases”新闻组中交叉发布了一个类似的问题,抱歉。
【问题讨论】:
-
究竟是什么问题。您的代码中有错误,但您没有显示任何代码,甚至没有进行任何调试。
-
指定 Delphi 版本。我想知道你是否被 Unicode vs ansi 字符串和字符误导了......
-
显示的声明适用于 Delphi 2007 和更早版本,其中
PChar是PAnsiChar,但不适用于 Delphi 2009+,其中PChar是PWideChar。SQLGetPrivateProfileString()不接受 Unicode 字符串,只接受 Ansi 字符串,因此您应该明确使用PAnsiChar而不是一般的PChar。 -
我猜你在连接数据库之前需要文件的路径?因为一旦连接上,您就可以使用属性
SQL_DATA_SOURCE_NAME调用SQLGetInfo(),它将保存mdb 文件的路径。
标签: windows delphi ms-access odbc dsn