我用ADOConnection和sql连接,在自己的机器上运行调试没有问题,但是到其他机器上就出错了,我想是ADOConnection的属性设置有错误!
请问我该如何动态的设置ADOConnection使得在每台机器上都可以运行,该如何设置用户名称呢?
如果我给了一台机器的名称,那么如何设置ADOConnection,使得ADOConnection与sql的连接不会出错?
请大家帮忙解决,一定给分!!

解决方案 »

  1.   

    建议你使用命名管道设置数据库别名,这样在每台机器上数据库别名都是一致的,那么程序就可以做到统一,从而减少了维护的麻烦。sqlserver菜单中有个Client Network Utility工具是来配置数据库别名的配置好后在企业管理器中注册一下就可以了。比如说别名都叫“server”,那你的程序在建立ADOConnection时就使用这个别名代替计算机名连接就可以了
      

  2.   

    给出你要连接机器的IP不就得了吗?[数据库]
    DATABASE NAME=<数据库名>
    SERVER NAME=<IP>
    USER NAME=<登录用户名>
    PASSWORD=<登录密码>
    SQLPASSTHRU MODE=SHARED NOAUTOCOMMIT[参数]
    DriverName=MSSQL[SYBASE.....]
    procedure ReadIniFile();
        Var IniFile : TIniFile;
    begin
        IniFile := TIniFile.Create(ExtractFileDir(Application.ExeName)+'\lang.ini');
        //IniFile.ReadSectionValues('数据库', Database1.Params);
        Try
            DBParam.DataBaseName := IniFile.ReadString('数据库','DATABASE NAME','');
            DBParam.ServerName   := IniFile.ReadString('数据库','SERVER NAME','');
            DBParam.UserName     := IniFile.ReadString('数据库','USER NAME','');
            DBParam.PassWord     := IniFile.ReadString('数据库','PASSWORD','');
            DBParam.SqlMode      := IniFile.ReadString('数据库','SQLPASSTHRU MODE','');
            DBParam.DriverName   := IniFile.ReadString('参数','DriverName','');
        finally
            IniFile.Free ;
        end;
    end;
      

  3.   

    在设置adoconnection时,选择允许保存密码了吗?服务器名称是标识中的计算机名吗?
      

  4.   

    你把登录的数据库的服务器名,数据库名,(登录SQL SERVER服务的用户名,密码)放在登录框内,登录成功记到文件里或者是注册表内,下次登录就把这段的内容隐藏掉,(把FORM的HEIGHT变短)
      

  5.   

    我是用INI文件实现的。根据不同的用户,直接修改INI文件的参数就行了。 
     INI文件内容如下:
      [Database]
       Provider=SQLOLEDB.1
       Password=ldt2001
       Persist Security Info=True
       User ID=sa
       Initial Catalog=SomeOneWatch_DB
       Data Source=YF
      
      然后在程序中写一个读取函数
      Function TDataModule1.ReadLoginParams():String;
    Var  fileName:String;
         systeminifile:Tinifile;
    begin
      Result:='';
      Filename:=extractfilepath(paramstr(0))+'Setup.ini';
      systeminifile:=tinifile.Create(filename);
      try
       Result:=Result+'Provider='+Systeminifile.ReadString('Database','Provider','')+';';
       Result:=Result+'Password='+Systeminifile.ReadString('Database','Password','')+';';
       Result:=Result+'Persist Security Info='+Systeminifile.ReadString('Database','Persist Security Info','')+';';
       Result:=Result+'User ID='+Systeminifile.ReadString('Database','User ID','')+';';
       Result:=Result+'Initial Catalog='+Systeminifile.ReadString('Database','Initial Catalog','')+';';
       Result:=Result+'Data Source='+Systeminifile.ReadString('Database','Data Source','');
      Finally
       Systeminifile.Destroy;
      End;
    End;最后在ADOConnection的ONLogin事件中写入
     procedure TDataModule1.ADOConnection1Login(Sender: TObject; Username,
      Password: String);
    begin
     AdoConnection1.ConnectionString:=ReadLoginParams();
    end;希望对你有帮助。
      

  6.   

    我给你一个一劳永逸的解决方案。
    1,启动时,判断注册表中有没有数据库连接字符串,若有,取出,解密,赋给AdoConnection组件,否则
    2,调用PromptDataSource函数,与用户交互,获取SQL连接信息;然后,加密,存放到注册表中;赋给AdoConnection组件。
    3,继续其他操作
      

  7.   

    unit UnitServerSel;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, dxEdLib, dxCntner, dxEditor, dxExEdtr,
      ExtCtrls, ComObj, DB, ADODB;type
      TFrmServerSel = class(TForm)
        dxPickEdit1: TdxPickEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        dxEdit1: TdxEdit;
        dxEdit2: TdxEdit;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Panel1: TPanel;
        dxEditStyleController1: TdxEditStyleController;
        Button4: TButton;
        ADOTest: TADOConnection;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure dxPickEdit1CloseUp(Sender: TObject; var Value: string;
          var Accept: Boolean);
        procedure dxEdit1KeyPress(Sender: TObject; var Key: Char);
        procedure dxEdit2KeyPress(Sender: TObject; var Key: Char);
        procedure Button4Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      FrmServerSel: TFrmServerSel;implementationuses Crypt, UnitCore;{$R *.dfm}procedure TFrmServerSel.FormCreate(Sender: TObject);
    begin
      Button1Click(nil);
    end;procedure TFrmServerSel.Button1Click(Sender: TObject);
    var
      SQLServer: Variant;
      ServerList: Variant;
      i, nServers: integer;
    begin
      SQLServer := CreateOleObject('SQLDMO.Application');
      ServerList := SQLServer.ListAvailableSQLServers;
      nServers := ServerList.Count;
      dxPickEdit1.Items.Clear;
      for i := 1 to nservers do
        dxPickEdit1.Items.Add(ServerList.Item(i));
      SQLServer := NULL;
      serverList := NULL;
    end;procedure TFrmServerSel.dxPickEdit1CloseUp(Sender: TObject;
      var Value: string; var Accept: Boolean);
    begin
      dxEdit2.SetFocus;
    end;procedure TFrmServerSel.dxEdit1KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key = #13 then
      begin
        Key := #0;
        dxEdit2.SetFocus;
      end;
    end;procedure TFrmServerSel.dxEdit2KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key = #13 then
      begin
        Key := #0;
        Button2.Click;
      end;
    end;procedure TFrmServerSel.Button4Click(Sender: TObject);
    begin
      AdoTest.ConnectionString := Format('Provider=SQLOLEDB.1;Persist Security Info=True;Data Source=%S;Initial Catalog=taxiCarMIS;User Id=%s;Password=%s', [dxPickEdit1.text, dxEdit1.text, dxEdit2.text]);
      try
        AdoTest.Connected := True;
        MessageBox(Handle, '测试连接成功!', '恭喜', MB_OK or MB_ICONINFORMATION);
        AdoTest.Connected := False;
      except on E: Exception do
          MessageBox(Handle, Pchar('测试连接失败!出错信息如下:' + #13 + E.Message), '提示', MB_OK or MB_ICONERROR);
      end;
    end;procedure TFrmServerSel.Button2Click(Sender: TObject);
    begin
      ConnStr := Format('Provider=SQLOLEDB.1;Persist Security Info=True;Data Source=%S;Initial Catalog=*******;User Id=%s;Password=%s', [dxPickEdit1.text, dxEdit1.text, dxEdit2.text]);
      ModalResult := mrOK;
    end;end.
      

  8.   

    unit UnitSplash;interfaceuses
      Forms, Classes, Windows, ExtCtrls, Graphics, Controls, StdCtrls, SysUtils,
      DB, ADODB, AdoConEd, IniFiles, jpeg;type
      TFrmSplash = class(TForm)
        Image1: TImage;
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      FrmSplash: TFrmSplash;
      TimeDelay: integer;implementationuses UnitCore, Crypt, UnitServerSel;{$R *.dfm}procedure TFrmSplash.Timer1Timer(Sender: TObject);
    begin
      TimeDelay := TimeDelay + 1;
      if TimeDelay = 5 then Close;
    end;procedure TFrmSplash.FormCreate(Sender: TObject);
    var
      s: string;
      Ini: TiniFile;
    begin
      TimeDelay := 0;
      SysDir := ExtractFilePath(Application.ExeName);
      Ini := TiniFile.Create(SysDir + IniName);
      try
        s := Ini.ReadString('LoginInit', 'ConnectStr', '');
        OperatorID := Ini.ReadString('LoginInit', 'DefaultUser', '');
        AppTitle := Ini.ReadString('SysInit', 'AppTitle', '');
      finally
        Ini.Free;
      end;
      ConnStr := Decrypt(S, 65535);
      Application.Title := AppTitle + '管理系统';
    end;procedure TFrmSplash.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      s: string;
      Ini: TiniFile;
    begin
      if ((Key = 83) and (ssAlt in shift)) then
      begin
        Hide;
        Timer1.Enabled := False;
        with TFrmServerSel.Create(Application) do
        try
          if ShowModal = mrOK then
          begin
            s := EnCrypt(ConnStr, 65535);
            Ini := TiniFile.Create(SysDir + IniName);
            try
              Ini.WriteString('LoginInit', 'ConnectStr', s);
            finally
              Ini.Free;
            end;
          end;
        finally
          free;
        end;
        Close;
      end;
    end;end.
      

  9.   

    unit UnitDM;interfaceuses
      SysUtils, Classes, DB, ADODB, Forms, dxCntner, ImgList, Controls,
      KsSkinEngine, FR_Desgn, FR_Rich;type
      TDM = class(TDataModule)
        MainConnect: TADOConnection;
        dxStyleController: TdxEditStyleController;
        SeSkinEngine1: TSeSkinEngine;
        SeSkinEngine2: TSeSkinEngine;
        frDesigner1: TfrDesigner;
        frRichObject1: TfrRichObject;
        procedure DataModuleCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DM: TDM;implementationuses UnitCore;{$R *.dfm}procedure TDM.DataModuleCreate(Sender: TObject);
    begin
      MainConnect.Connected := False;
      MainConnect.ConnectionString := ConnStr;
      try
        MainConnect.Connected := True;
      except on E: Exception do
        begin
          Application.MessageBox(Pchar('连接失败,请检查,出错信息:' + E.message), '提示信息', 0);
          Application.Terminate;
        end;
      end;
    end;end.