怎样完成ODBC的自动配置?
  比如
      连接一个ACCESS数据库
      首先就要在ODBC里设置好数据来源才行
      然后用ADOCONNECTION连接它
  那么
      怎样做才能让它自动完成这些配置呢
      是自己写个程序实现,还是用相关的软件来编写

解决方案 »

  1.   

    连接ACCess可以用ADO,不用在ODBC中配置.你可以用一下ADO空间,
    如果你在ODBC中,有相应的接口函数可以完成你要的功能,不过Delphi用的的BDE.你要查一下MSDN如何配置ODBC
      

  2.   

    一个简单程序的发布:一个可执行文件.EXE文件,一个ACCESS数据库文件
    在自己机子上编译肯定是没有问题的
      

  3.   

    如果不设置ODBC的数据源
    就出现如下错误:
    “ODBC驱动程序管理器没发现数据源名称并且未指定默认驱动程序”
      

  4.   

    就是如何将数据库自动注册到ODBC数据源中去
      

  5.   

    function ConfigAccessODBC(aDSN:string;aDBName:string):boolean;
    var
      reg: TRegistry;
      bData : array[ 0..0 ] of byte;
      DrvPath : string;
    begin
      reg:= TRegistry.Create;
      with reg do
      begin
        RootKey:=HKEY_LOCAL_MACHINE;
        if OpenKey('SOFTWARE\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',false) then
        begin
          DrvPath:=ReadString('Driver');
        end
        else
        begin //创建键值失败
          //ShowMessage('公共信息'+':'+chr(10)+chr(10)+'您没有正确安装驱动程序Microsoft Access Driver (*.mdb),请重新安装!','错误信息', mb_applmodal+mb_iconerror+mb_ok+mb_defbutton1);
          ConfigAccessOdbc:=false;
          exit;
        end;
        Reg.CloseKey;
        //找到Software\ODBC\ODBC.INI\ODBC Data Sources
        if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
        begin
          WriteString(aDSN, 'Microsoft Access Driver (*.mdb)' );
        end
        else
        begin //创建键值失败
          //application.MessageBox('公共信息'+':'+chr(10)+chr(10)+'配置ODBC数据源失败!','错误信息', mb_applmodal+mb_iconerror+mb_ok+mb_defbutton1);
          ConfigAccessOdbc:=false;
          exit;
        end;
        CloseKey;
       //找到或创建Software\ODBC\ODBC.INI\msac_infodb,写入DSN配置信息
       if OpenKey('Software\ODBC\ODBC.INI\'+aDSN,True) then
       begin
         WriteString( 'DBQ', aDBName);//数据库目录,连接您的数据库
         WriteString( 'Description','系统信息数据库数据源' );//数据源描述
         //WriteString( 'Driver', 'C:\WINNT\System32\odbcjt32.dll' );
         WriteString( 'Driver', DrvPath );//驱动程序DLL文件
         WriteInteger( 'DriverId', 25 ); //驱动程序标识
         WriteString( 'FIL', 'Ms Access;' );//Filter依据
         WriteInteger( 'SafeTransaction', 0 );//支持的事务操作数目
         WriteString( 'UID', '' );//用户名称
         bData[0] := 0;
         WriteBinaryData( 'Exclusive', bData, 1 ); //非独占方式
         WriteBinaryData( 'ReadOnly', bData, 1 ); //非只读方式
       end
       else//创建键值失败
       begin
         //application.MessageBox('公共信息'+':'+chr(10)+chr(10)+'配置ODBC数据源失败!','错误信息', mb_applmodal+mb_iconerror+mb_ok+mb_defbutton1);
         ConfigAccessOdbc:=false;
         exit;
       end;
       CloseKey;
      //找到或创建Software\ODBC\ODBC.INI\msac_infodb\Engines\Jet
      //写入DSN数据库引擎配置信息
       if OpenKey('Software\ODBC\ODBC.INI\'+aDSN+'\Engines\Jet',True) then
       begin
         WriteString( 'ImplicitCommitSync', 'Yes' );
         WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小
         WriteInteger( 'PageTimeout', 10 );//页超时
         WriteInteger( 'Threads', 3 );//支持的线程数目
         WriteString( 'UserCommitSync', 'Yes' );
       end
       else//创建键值失败
       begin
         //application.MessageBox('公共信息'+':'+chr(10)+chr(10)+'配置ODBC数据源失败!','错误信息', mb_applmodal+mb_iconerror+mb_ok+mb_defbutton1);
         ConfigAccessOdbc:=false;
         exit;
       end;
       CloseKey;
       ConfigAccessOdbc:=True;
       Free;
      end;
    end;
      

  6.   

    我是用ADO的啊
    但是没有数据源程序运行的时候就会报错
    TO:myth_2002(myth) 
    参数aDSN是什么意思啊,看不太懂,请赐教!
      

  7.   

    有没有人看懂myth_2002(myth) 
    的函数
    解答有分
      

  8.   

    我写的一个动态设置ODBC数据源的例子,是连接FOXPRO的,你可以参考注册表中ACCESS的连接方法,另,如果连接ACCESS,最好不能过ODBC,用ADO直连,在设置连接字符串的时候通过JET 4.0而不是ODBC
    //动态设置ODBC数据源unit ODBC;interfaceuses
      Windows,SysUtils, Forms,Registry;procedure ODBCCreate();implementationprocedure ODBCCreate();
    var
      RegODBC:Tregistry;
    begin
    Try
      RegODBC:=Tregistry.Create;
      RegODBC.RootKey:=HKEY_CURRENT_USER;
      RegODBC.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources',true);
      RegODBC.WriteString('MyODBC','Microsoft Visual FoxPro Driver');
      RegODBC.CloseKey;
      if RegODBC.OpenKey('\Software\ODBC\ODBC.INI\MyODBC',True) then
         begin
            RegODBC.WriteString('BackgroundFetch','Yes');
            RegODBC.WriteString('Collate','Machine');
            RegODBC.WriteString('deleted','Yes');
            RegODBC.WriteString('Description','');
            RegODBC.WriteString('Driver',ExtractFilePath(Application.ExeName)+'vfpodbc.dll');
            RegODBC.WriteString('Exclusive','NO');
            RegODBC.WriteString('Null','Yes');
            RegODBC.WriteString('SetNoCountOn','NO');
            RegODBC.WriteString('SourceDB',ExtractFilePath(Application.ExeName));
            RegODBC.WriteString('SourceType','DBF');
         end
      else
        begin
            application.MessageBox('无法创建ODBC数据源,请确认注册表未写保护','警告',mb_ok);
            application.Destroy;
        end;
    Finally
      RegODBC.CloseKey;
      RegODBC.free;
    end;
    end;
    end.
      

  9.   

    aDSN就是你在ODBC中起的数据源的名称
      

  10.   

    晕呀
    你连数据库access,就别用什么odbc了,直接连access,数据库搞成相对路径,只要不让exe和access保持相对的路径,什么时候都能用
      

  11.   

    成功了!
    谢谢myth_2002(myth)