程序写好了,我写了动态配置odbc的程序,想考到其他机器上用。
但原来在程序调试过程中连接到odbc的adoconnection不用调整吗?
也要动态了吧?

解决方案 »

  1.   

    //***************************************************
    //目的:读取驱动程序位置
    //参数:AName--要读取的数据库驱动类型的标志(自己可以任意定制)
    //***************************************************
    Function ReadODBCDriver(AName: String):String;
    var
      registerTemp: TRegistry;
      s:string;
    begin  registerTemp:=TRegistry.Create;
      if AName='Access' then
      begin
        with registerTemp do
        begin
          RootKey:=HKEY_LOCAL_MACHINE;
          if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',True) then
          begin
            s:=ReadString('Driver');
            ReadODBCDriver:=ReadString('Driver');
            CloseKey;
            Free;
            Exit;
          end;
        end;
      end;
      registerTemp.Free;
      ReadODBCDriver:=''; end;//****************************************************
    //目的:建立数据库驱动程序并配置
    //参数:AName--要建立的ODBC数据库别名
    //      APath--要连接的数据库路径名称
    //      ADriver--ODBC驱动名称,由系统获取
    //****************************************************
    Function CreateMsAccess(AName: String; APath: String; ADriver: String):Boolean;
    var
      registerTemp:TRegistry;
      bData:array[0..0] of byte;
    begin  if ADriver='' then
      begin
        //ShowMessage('读取ODBC驱动程序失败,请重新安装ODBC!');
        CreateMsAccess:=False;
        Exit;
      end;
      
      registerTemp:=TRegistry.Create;
      CreateMsAccess:=True;
      with registerTemp do
      begin
        RootKey:=HKEY_LOCAL_MACHINE;
        if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
        begin
          //注册一个DSN名称--AName
          WriteString(AName,'Microsoft Access Driver (*.mdb)');
        end
        else
        begin
          CreateMsAccess:=False;
          Exit; 
        end;
        CloseKey;
        
        //写入DSN配置信息
        if OpenKey('Software\ODBC\ODBC.INI\'+AName,True) then
        begin
          //数据库目录,连接你的数据库
          WriteString('DBQ',APath);
         
          //数据源描述 --任意修改??????????
          WriteString('Description','Nsky Access DataBase');      //驱动程序DLL文件
          WriteString('Driver',ADriver);      //驱动程序标志
          WriteInteger('DriverId',25);      //Filter依据
          WriteString('FIL','Ms Access;');      //支持的事务操作数目
          WriteInteger('SafeTransaction',0);      //用户名称
          WriteString('UID','');      //用户密码--可以修改定制??????????
          WriteString('PWD','nsky');
          
          bData[0]:=0;
          //非独占方式
          WriteBinaryData('Exclusive',bData,1);      //非只读方式
          WriteBinaryData('ReadOnly',bData,1);     
        end
        else
        begin
          CreateMsAccess:=False;
          Exit;
        end; 
        CloseKey;
        
        //写入DSN数据库引擎配置信息
        if OpenKey('Software\ODBC\ODBC.INI\'+AName+'\Engines\Jet',True) then
        begin
          WriteString('ImplicitCommitSync','Yes');
          //缓冲区大小
          WriteInteger('MaxBufferSize',512);      //页超时
          WriteInteger('PageTimeout',10);     //支持的线程数目
         WriteInteger('Threads',3);
        
         WriteString('UserCommitSync','Yes');
        end
        else
        begin
          CreateMsAccess:=False;
          Exit;
        end;
        CloseKey;
        Free;
      end;    end;
      

  2.   

    上面的程序我已经写好了啊,是建立系统DSN,这样就可以用了吗?
    调试过程中用的是指定的用户DSN啊,那现在要怎么办?把原来adoconnection
    指定的connectstring删掉?
      

  3.   

    从外部文件中取    可以吗 ?建一个 DB.Dat 文件 [Database]
    ConnectString=Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=sms_Tv;Data Source=zhangyy;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=zhangyy;Use Encryption for Data=False;Tag with column collation when possible=False然后, 
      
      ConnectionStringOfDb : String;  with TIniFile.Create(GetExePath + 'DB.Dat') do
      begin
        ConnectionStringOfDb := ReadString('Database', 'ConnectString', '');
      end;
        
     得到链接字符串 或用INI文件也可以