//你自己对比一下吧
function CreateODBC(DSN, LoginName, ServerName: string): Boolean;
var
  RegisterTemp: TRegistry;
  Os, SystemRoot: string;
begin
  Result := False;
  RegisterTemp := TRegistry.Create;
  with RegisterTemp do try
    RootKey := HKEY_LOCAL_MACHINE;
    if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources', True) then
      WriteString(DSN, 'SQL Server' ) else Exit;
    CloseKey;
    
(*ZsGetSystemVersion;*)
    ///  判断操作系统
    OpenKey('Software\Microsoft\Windows\CurrentVersion', False);
    if ReadString('ProductId') <> '' then
    begin
      Os := 'Windows';
      SystemRoot := ReadString('SystemRoot');
    end else
    begin
      CloseKey;
      OpenKey('Software\Microsoft\Windows NT\CurrentVersion', False);
      if ReadString('ProductId') <> '' then
      begin
        Os := 'Winnt';
        SystemRoot := ReadString('SystemRoot');
      end;
    end;
          ///
    CloseKey;
    if OpenKey('Software\ODBC\ODBC.INI\' + DSN, True) then
    begin
      if UpperCase(Os) = 'WINNT' then
      begin
        if FileExists(SystemRoot + '\System32\sqlsrv32.dll') then
           WriteString( 'Driver', SystemRoot + '\System32\sqlsrv32.dll') //驱动程序DLL文件
        else
        begin
          MessageDlg('缺少文件sqlsrv32.dll',mterror,[mbok],0);
          Result:=False;
          Exit;
        end;
      end else if UpperCase(Os) = 'WINDOWS' then begin
        if FileExists(SystemRoot + '\System\sqlsrv32.dll') then
          WriteString('Driver', SystemRoot + '\System\sqlsrv32.dll' )
        else begin
          MessageDlg('缺少文件sqlsrv32.dll', mtError, [mbok], 0);
          Result := False;
          Exit;
        end;
      end;
      WriteString('Database', C_SQLServerDataBaseName);
      WriteString('LastUser', LoginName);
      WriteString('Server', ServerName);
      Result := True;
    end else Exit;
  finally
    CloseKey;
    Free;
  end;
end;

解决方案 »

  1.   

    用一个函数,特别经典的函数:SQLConfigDataSource
    SQLConfigDataSource(0, ODBC_ADD_SYS_DSN,
    ‘SQL Server', 
    ‘DSN=Record_ODBC'+ chr(0) +
    ‘Server=(local)'+ chr(0) + 
    ‘Database=DatabaseName'+ chr(0) +
    ‘Description=动态配置ODBC’); 
    要是不能用你扁我,怎么样,爽吧!
      

  2.   

    //在什么单元?
    SQLConfigDataSource
      

  3.   

    用一个函数,特别经典的函数:SQLConfigDataSource
    SQLConfigDataSource(0, ODBC_ADD_SYS_DSN,
    ‘SQL Server',                               //数据库类型
    ‘DSN=Record_ODBC'+ chr(0) +                 //设置数据源名称
    ‘Server=(local)'+ chr(0) +                  //SQL Server数据库服务器名称
    ‘Database=DatabaseName'+ chr(0) +           //数据库名称
    ‘Description=动态配置ODBC’                  //描述
     ……………………);                         //可以继续添加其他配置项  
      

  4.   

    该死,该死,这个我怎么能忘了呢?该打,这是一个在DLL里的函数!
    必须声明如下:
    function SQLConfigDataSource(hwndParent: Integer;fRequest: Integer; lpszDriverString: String; lpszAttributes: String): Integer; stdcall;external ‘ODBCCP32.DLL';
      

  5.   

    谢谢两位,其实你们误解我的意思了.我现在在注册表中已写入相关信息,但是system dsn中又找不到这个pf,我该如何使用它呢?现将database1的databasename设置为'pf',可是提示找不到它.
    帮帮忙吧,老兄,问题解决后给分.
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var registertemp:tregistry;
    begin
        registertemp:=tregistry.create;
        with registertemp do
        begin
        rootkey:=hkey_local_machine;
        if openkey('software\odbc\odbc.ini\odbc data source',true) then  //应该是…\odbc data sources'  
        begin
        writestring('pf','sql server');
        end;
        closekey;
        if openkey('software\odbc\odbc.ini\pf',true) then
        begin
        writestring('database','pfjxc');
        writestring('driver','C:\WINDOWS\SYSTEM\SQLSRV32.dll');
        writestring('lastuser','sa');
        writestring('server','nto_nt1');
        end;
        closekey;
        free;
        end;
    end;我试了,没有问题,就是少了一个‘s’而已!
      

  7.   

    谢谢各位,尤其是thygw(注册表错误)