用修改注册表方式添加ODBC连接出现问题代码如下,运行之后无问题,查看注册表中键值与手工配置完全一样,可是系统的管理工具中虽然有了这个ODBC连接,却没有指向我需要的Execl文件,请问是什么原因呢?  reg := TRegistry.Create;
  //建立一个Registry实例
  with reg do
  begin
     REG.RootKey:=HKEY_LOCAL_MACHINE;
     //REG.OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources', True);
     //设置根键值为HKEY_LOCAL_MACHINE
     //找到Software\ODBC\ODBC.INI\ODBC Data Sources
    if REG.OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources', True) then
       begin
         //注册一个DSN名称
         REG.WriteString( 'myexecl'  ,'Microsoft Excel Driver (*.xls)' );
       end
     else
       begin
         //创建键值失败
         ShowMessage('增加ODBC数据源失败');
         exit;
       end;
     REG.CloseKey;
//找到或创建Software\ODBC\ODBC.INI\masdsn 写入DSN配置信息
   if REG.OpenKey('Software\ODBC\ODBC.INI\myexecl' ,True) then
      begin
       //  REG.WriteBinaryData( 'ReadOnly',BUF,01);
         REG.WriteString( 'DBQ',Edit6.Text);
         REG.WriteString( 'DefaultDir','F:\');
         REG.WriteString( 'Driver'  ,'C:\WINDOWS\system32\odbcjt32.dll' );
         REG.WriteInteger( 'DriverId'  ,790 );
         REG.WriteString( 'FIL'  ,'excel 8.0;');
         REG.WriteInteger( 'SafeTransactions'  ,0 );
         REG.WriteString( 'UID'  ,'');
       end
             else
  //创建键值失败       begin
     Showmessage('增加ODBC数据源失败');
       exit;
       end;
       if REG.OpenKey('Engines' ,True) then
         begin
              if REG.OpenKey('Execl' ,True) then
              begin
              BUF[1]:=01;
            REG.WriteBinaryData( 'FirstRowHasNames',BUF  ,1);
            REG.WriteString( 'ImplicitCommitSync','');
            REG.WriteInteger( 'MaxScanRows'  ,8 );
            REG.WriteInteger( 'Threads'  ,3 );
            REG.WriteString( 'UserCommitSync'  ,'Yes');
              end;
         end ;  reg.CloseKey;
  reg.Free;
  //ShowMessage('增加ODBC数据源成功');  end;

解决方案 »

  1.   

    注册DNS名称的值应该是Driver do Microsoft Excel(*.xls)
    其实我也不会,我用系统管理中的ODBC配置了下,然后发现如上的错误。
    建议你以后可以将注册表中的那些需要修改的项导出,然后复制要修改的值就不容易错了。
      

  2.   

    建议改在ADO的连接方式, 不用进行这么复杂的配制. 基于NT的系统在HKLM下面创建键值要有Administrators组的权限, 显然这样做可行性不高.