【问题标题】:Get the list of ODBC data source names programmatically using Delphi使用 Delphi 以编程方式获取 ODBC 数据源名称列表
【发布时间】:2011-10-06 14:01:48
【问题描述】:

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

我只需要使用 Delphi 标准组件,所以我不能使用 3d 派对解决方案。

【问题讨论】:

  • 读取该注册表位置有什么问题?
  • 这没有问题。它甚至比访问 ODBC32.DLL 更简单。我在问我怎样才能以正确的方式做到这一点。

标签: delphi odbc ado delphi-2006


【解决方案1】:

您必须使用 ODBC32.DLL 中的 SQLDataSources 函数。对于example

【讨论】:

    【解决方案2】:

    正如@da-soft 在their answer 中所述,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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2018-05-07
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多