在本地我有两个子系统,用户数据源名称相同,但访问不同的数据库(Acess 2000),在各子系统中自动建立ODBC数据源。在运行其中一个子系统后,建立该子系统对应的数据源,要想在不删除ODBC数据源的情况下,运行另一个子系统,在这个子系统运行时,先检测数据源配置是否正确,如果不正确,则WriteString('DBQ',dir_name);   //数据库  为什么在运行时,仍然无法配置,请高手指教。谢谢。100分赠送。
procedure Tsafe_mainForm.autoodbc();
var
  registerTemp : TRegistry;
  my_driver,dir_name,s,t:string;
  i:integer;
  index:array[1..10] of integer;
  bData:array[ 0..0 ] of byte;
begin           dir_name:=ExtractFilePath(Application.ExeName);
           for i:=1 to 10 do
             index[i]:=0;
           i:=1;
           while Pos('\',dir_name)>0 do
           begin
             index[i]:=Pos('\',dir_name);
             dir_name[Pos('\', dir_name)]:= '/';
             i:=i+1;
           end;
           dir_name:=ExtractFilePath(Application.ExeName);
           dir_name:=leftstr(dir_name,index[i-2]);
           dir_name:=dir_name+'data\shays.mdb';  registerTemp:=TRegistry.Create;                        //创建一个registry实例
  with registerTemp do
  begin
    //RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE,系统数据源
    Rootkey:=HKEY_CURRENT_USER;    //设置根键值为HKEY_LOCAL_MACHINE,用户数据源    //                              找到Software\ODBC\ODBC.INI\ODBC Data Sources
    if OpenKey('Software\ODBC\ODBC.INI\ODBC data sources',true)then
      if readstring('shays')<>'' then
        begin
          if OpenKey('Software\ODBC\ODBC.INI\shays',true)then
          begin
             s:= ReadString('DBQ');
            if s<> dir_name then
               WriteString('DBQ',dir_name);   //数据库目录
               t:= ReadString('DBQ');          exit
          end;
        end
       else
        begin
          //设置根键值为HKEY_LOCAL_MACHINE
          Rootkey:=HKEY_LOCAL_MACHINE;
          //     找到Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)
          if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',true)then
            my_driver:=readstring('Driver')
           else
            begin
              Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
              exit;
            end;
          closekey;         Rootkey:=HKEY_CURRENT_USER;
         if openkey('Software\ODBC\ODBC.INI\ODBC data sources',true)then
           writestring('shays','Microsoft Access Driver (*.mdb)')
          else
           begin
             Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
             exit;
           end;
           closekey;         //找到或创建Software\ODBC\ODBC.INI\shays,写入DSN配置信息
         if OpenKey('Software\ODBC\ODBC.INI\shays',true)then
         begin
           WriteString('DBQ',dir_name+'data\shays.mdb');      //数据库目录
           writestring('Description','我的数据库设置');            //数据源描述
           writestring('Driver',my_driver);                   //驱动程序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('增加ODBC数据源失败','警告',MB_ICONHAND);
           exit;
         end;
       closekey;
      //找到或创建software\ODBC\ODBC.INI\shays\Engines\Jet
     //写入DSN数据库引擎配置信息
      if openkey('software\ODBC\ODBC.INI\shays\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('增加ODBC数据源失败','警告',MB_ICONHAND);
          exit;
        end;
      closekey;
    end;
  Free;
  end;
end;