我想在delphi程序中让用户自己创建ODBC数据源,就是调用控制面板中的创建数据源(ODBC)程序,请问该如何做?

解决方案 »

  1.   

    写注册表HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI模仿现有的加一个就行了。或,
    摘自猛料下面这个例子显示了如何加载实现了ODBC 管理功能的DLL(odbccp32.dll)来创建一个Access MDB文件和指向它的ODBC DSN。注意:这里假设DLL和MDB都在当前目录下。
    同时,"CREATE_DB"的调用是Access(MS Jet引擎)的专有调用,类似的还有COMPACT_DB和REPAIR_DB等。const
      ODBC_ADD_DSN = 1; // 添加数据源
      ODBC_CONFIG_DSN = 2; // 配置数据源
      ODBC_REMOVE_DSN = 3; // 删除数据源
      ODBC_ADD_SYS_DSN = 4; // 添加系统DSN
      ODBC_CONFIG_SYS_DSN = 5; // 配置系统DSN
      ODBC_REMOVE_SYS_DSN = 6; // 删除系统DSNtype
      TSQLConfigDataSource = function( hwndParent: HWND;
      fRequest: WORD;
      lpszDriver: LPCSTR;
      lpszAttributes: LPCSTR ) : BOOL; stdcall;
    procedure Form1.FormCreate(Sender: TObject);
    var
      pFn: TSQLConfigDataSource;
      hLib: LongWord;
      strDriver: string;
      strHome: string;
      strAttr: string;
      strFile: string;
      fResult: BOOL;
      ModName: array[0..MAX_PATH] of Char;
      srInfo : TSearchRec;
    begin
      Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
      strHome := ModName;
      while ( strHome[length(strHome)] <> '\' ) do
      Delete( strHome, length(strHome), 1 );
      strFile := strHome + 'TestData.MDB'; // 检查Access权限(Axes = Access)
      hLib := LoadLibrary( 'ODBCCP32' );
      if( hLib <> NULL ) then
      begin
      @pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
      if( @pFn <> nil ) then
      begin
      // 强迫重建DSN
      strDriver := 'Microsoft Access Driver (*.mdb)';
      strAttr := Format( 'DSN=TestDSN'+#0+
      'DBQ=%s'+#0+
      'Exclusive=1'+#0+
      'Description=Test Data'+#0+#0,
      [strFile] );
      fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
      if( fResult = false ) then ShowMessage( '创建DSN (Datasource)失败!' );  // 检测/创建同DSN关联的 MDB 文件
      if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
      begin
      strDriver := 'Microsoft Access Driver (*.mdb)';
      strAttr := Format( 'DSN=TestDSN'+#0+
      'DBQ=%s'+#0+
      'Exclusive=1'+#0+
      'Description=Test Data'+#0+
      'CREATE_DB="%s"'#0+#0,
      [strFile,strFile] );
      fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
      if( fResult = false ) then ShowMessage( '创建MDB文件失败!' );
      end;
      FindClose( srInfo );  end;  FreeLibrary( hLib );
      end
      else
      begin
      ShowMessage( '无法加载ODBCCP32.DLL' );
      end;
    end;
      

  2.   

    但我听说有一个odbc api函数SQLConfigDataSource能实现该功能,但我使用的时候确发现它和普通的api函数不一样,delphi不认识它,估计要添加什么其他的单元吧!有没有高手教一教我?谢谢了!