我看到几个示例,其中源名称列表来自注册表(HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI \ ODBC数据源)。有没有其他方法来获取ODBC数据源名称列表?
我只需要使用Delphi标准组件,因此我无法使用3d派对解决方案。
答案 0 :(得分:6)
您必须使用ODBC32.DLL中的SQLDataSources函数。对于example。
答案 1 :(得分:1)
如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.