我看到了几个示例,这些示例中的源名称列表是从注册表中获取的(HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI.ODBC数据源)。还有其他方法可以获取ODBC数据源名称列表吗?
我只需要使用Delphi标准组件,所以我不能使用3d party解决方案。
您必须使用ODBC32.DLL中的SQLDataSources函数。对于example。
如their answer中的@ da-soft所述,ODBC32.DLL中的SQLDataSources将执行此操作。但是,由于他们提供的链接不再起作用,所以这是一个实际示例(改编自Menno Avegaar对an old delphi groups post的回答):
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
function SQLAllocEnv(var EnvironmentHandle: Pointer): SmallInt; stdcall; external 'odbc32.dll';
function SQLFreeEnv(EnvironmentHandle: Pointer): SmallInt; stdcall; external 'odbc32.dll';
function SQLDataSources(
EnvironmentHandle: Pointer;
Direction: Word;
ServerName: PAnsiChar;
BufferLength1: SmallInt;
var NameLength1: SmallInt;
Description: PAnsiChar;
BufferLength2: SmallInt;
var NameLength2: SmallInt): SmallInt; stdcall; external 'odbc32.dll';
const
SQL_SUCCESS = 0;
SQL_NO_DATA = 100;
SQL_FETCH_NEXT = 1;
SQL_FETCH_FIRST = 2;
SQL_MAX_DSN_LENGTH = 32;
SQL_MAX_OPTION_STRING_LENGTH = 256;
var
EnvironmentHandle: Pointer;
Buffer1: array[0..SQL_MAX_DSN_LENGTH] of AnsiChar;
Buffer2: array[0..SQL_MAX_OPTION_STRING_LENGTH] of AnsiChar;
Len1, Len2: SmallInt;
ServerName, Description: String;
begin
if SQLAllocEnv(EnvironmentHandle) = SQL_SUCCESS then
begin
try
if SQLDataSources(
EnvironmentHandle,
SQL_FETCH_FIRST,
Buffer1,
SizeOf(Buffer1),
Len1,
Buffer2,
SizeOf(Buffer2),
Len2) = SQL_SUCCESS then
repeat
SetString(ServerName, Buffer1, Len1);
SetString(Description, Buffer2, Len2);
Writeln('Name:'+ServerName);
Writeln('Description:'+Description);
Writeln('');
until SQLDataSources(
EnvironmentHandle,
SQL_FETCH_NEXT,
Buffer1,
SizeOf(Buffer1),
Len1,
Buffer2,
SizeOf(Buffer2),
Len2) = SQL_NO_DATA;
finally
SQLFreeEnv(EnvironmentHandle);
end;
end;
Readln;
end.