使用Delphi以编程方式获取ODBC数据源名称列表

时间:2011-10-06 14:01:48

标签: delphi odbc ado delphi-2006

我看到几个示例,其中源名称列表来自注册表(HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI \ ODBC数据源)。有没有其他方法来获取ODBC数据源名称列表?

我只需要使用Delphi标准组件,因此我无法使用3d派对解决方案。

2 个答案:

答案 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.