我们做数据库连接SQL SERVER一般通过手工设置控件面板中的数据源ODBC。
但当我们做应用软件时不能让客户去自己创建,请问怎么样在DELPHI中编程实现?
在线等待......

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
            ls_dsn,ls_database,ls_desc,ls_login_id,ls_server_ip:string;
            lbl_user_dsn:boolean; // true-->user_dsn,false-->system dsn
            registerTemp : TRegistry;
    begin
            //判断用户输入的信息是否正确
            ls_dsn:=trim(Edit1.text);            //取得数据源名
            ls_database:=trim(Edit2.text);  //取得数据库名
            ls_desc:=trim(Edit3.text);          //取得描述名
            ls_login_id:=trim(Edit4.text);  //取得用户名
            //取得数据库所在的IP地址
            ls_server_ip:=Edit5.text;        //判断数据源名是否填写
            if ls_dsn='' then
                    begin
                    showmessage('请输入数据源名');
                    Edit1.SetFocus ;
                    exit;
                    end;        registerTemp := TRegistry.Create; //建立一个Registry实例
            with registerTemp do
                    begin
                    if RadioButton1.Checked then
                            RootKey:=HKEY_CURRENT_USER //设置根键值为HKEY_CURRENT_USER
                    else
                            RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE        //找到Software\ODBC\ODBC.INI\ODBC Data Sources
            if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
                    begin //注册一个DSN名称
                    WriteString( ls_dsn, 'SQL Server' );
                    end
            else
                    begin//创建键值失败
                    Showmessage('增加ODBC数据源失败'+#13+formatdatetime('yyyy-mm-dd hh:mm:ss',now));
                    exit;
                    end;
            CloseKey;        //找到或创建Software\ODBC\ODBC.INI\MyAccess,写入DSN配置信息
            if OpenKey('Software\ODBC\ODBC.INI\'+ls_dsn,True) then
                    begin
                            WriteString( 'Database',ls_database);//数据库
                            WriteString( 'Description',ls_desc);//数据源描述
                            WriteString( 'Driver', 'E:\Windows\SYSTEM\sqlsrv32.dll' );//驱动程序DLL文件
                            Writestring( 'LastUser',ls_login_id);//
                            WriteString( 'Server', ls_server_ip);//用户名称
                    end
            else//创建键值失败
                    begin
                    Showmessage('增加ODBC数据源失败'+#13+#10+formatdatetime('yyyy-mm-dd hh:mm:ss',now));
                    exit;
                    end;
            CloseKey;        showmessage('已成功创建新的ODBC数据源');
            Showmessage('已成功创建新的ODBC数据源'+#13+#10+formatdatetime('yyyy-mm-dd hh:mm:ss',now));
            Free;
            end;
    end;
      

  2.   

    haerbin982():
     为什么没有设置登录访问数据源密码?
      

  3.   

    Function RegODBC(ODBCName,FileName:String):Boolean;
    var
      RegistryTemp:TRegistry;
      bData : array[ 0..0 ] of byte;
      StrKeyName:String;begin
      RegistryTemp:=TRegistry.Create;
      try
      RegistryTemp.RootKey:=HKEY_CURRENT_USER;
      IF RegistryTemp.OpenKey('\SoftWare\ODBC\ODBC.INI\ODBC data Sources',false) then
      begin
         RegistryTemp.WriteString(ODBCName,'Microsoft Access Driver (*.mdb)');  //考虑以后的通用性,加入多种数据库选
         //RegistryTemp.CloseKey;
         Result:=true;
      end
      else
      begin
         MessageBox(Application.Handle,PChar('注册odbc数据源失败'),PChar('注册'),MB_OK);
         Result:=False;
         Exit;
      end;
      //Registrytemp.OpenKey('\SoftWare\ODBC\ODBC.INI',True);
      //RegistryTemp.WriteString(ODBCName);
      with RegistryTemp  do
      begin
      if OpenKey('\SoftWare\ODBC\ODBC.INI\'+ODBCName,true) then
      begin
         WriteString( 'DBQ',FileName );//数据库目录
         WriteString( 'Description','测试数据库' );//数据源描述
         WriteString( 'Driver', 'C:\PWIN98\SYSTEM\odbcjt32.dll' );//驱动程序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;
      StrKeyName:='\SoftWare\ODBC\ODBC.INI\'+ODBCName+'\Engines';
      OpenKey(StrKeyName,true);
      StrKeyName:='\SoftWare\ODBC\ODBC.INI\'+ODBCName+'\Engines\Jet';  if OpenKey(StrKeyName,True) then
      begin
        WriteString( 'ImplicitCommitSync','');
        WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小
        WriteInteger( 'PageTimeout', 10 );//页超时
        WriteInteger('Threads', 3 );//支持的线程数目
        WriteString( 'UserCommitSync', 'Yes' );
        ShowMessage('注册成功');
      end;
      end;  finally
        RegistryTemp.Free;  end;
    end;