一个CS程序里,因为经常要变动SQL的服务器地址,把服务器地址及用户名存在INI文件里,然后读取出来.这样能不能用数据模块实现,还要用其它方法,我刚开始接触没经验,请帮忙,谢!

解决方案 »

  1.   

    unit UDBini;interfaceuses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, bsSkinCtrls,inifiles, StdCtrls, Mask, bsSkinBoxCtrls, BusinessSkinForm;
    type
      TfrmDBini = class(TForm)
        bsSkinStdLabel2: TbsSkinStdLabel;
        bsSkinStdLabel1: TbsSkinStdLabel;
        dn: TbsSkinStdLabel;
        bsSkinButton1: TbsSkinButton;
        bsSkinButton2: TbsSkinButton;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        bsBusinessSkinForm1: TbsBusinessSkinForm;
        procedure bsSkinButton1Click(Sender: TObject);
        procedure bsSkinButton2Click(Sender: TObject);
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure Edit2KeyPress(Sender: TObject; var Key: Char);
        procedure Edit3KeyPress(Sender: TObject; var Key: Char);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
      logined,relogin:boolean;
        { Public declarations }
      end;var
    //DB_DNS,DB_User,DB_Password : string ;
     //DBFile : Tinifile ;
      frmDBini: TfrmDBini;implementation
      uses umain,mycommon, Udm;
    {$R *.dfm}procedure TfrmDBini.bsSkinButton1Click(Sender: TObject);
    var
      DBFile : Tinifile ;
    begin
      if trim(edit1.Text) = '' then
      begin
        messagebox(application.Handle,'服务器名或IP不能为空!','提示',mb_ok+mb_iconinformation);
        edit1.SetFocus;
        exit ;
      end ;
      if trim(edit2.Text) = '' then
      begin
        messagebox(application.Handle,'用户名不能为空!','提示',mb_ok+mb_iconinformation);
        edit2.SetFocus;
        exit ;
      end ;
      if trim(edit3.Text) = '' then
      begin
        messagebox(application.Handle,'密码不能为空!','提示',mb_ok+mb_iconinformation);
        edit3.SetFocus;
        exit ;
      end;
      DBFile := tinifile.Create(extractfilepath(application.ExeName)+ 'DBConn.ini');
      DBFile.writestring('smxycsd','DB_DNS',trim(edit1.Text));
      DBFile.writestring('smxycsd','DB_User',trim(edit2.Text));
      DBFile.writestring('smxycsd','DB_Password',trim(edit3.Text));
      //DBFile.writestring('smxycsd','DB_Password',EncryStrHex(Edit3.Text, Edit3.Text));
      DBFile.Free;
       close;
    end;procedure TfrmDBini.bsSkinButton2Click(Sender: TObject);
    begin
    close;
    end;procedure TfrmDBini.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if (Key=#13) or (key=#9) then Edit2.SetFocus;
    end;procedure TfrmDBini.Edit2KeyPress(Sender: TObject; var Key: Char);
    begin
    if (Key=#13) or (key=#9) then Edit3.SetFocus;
    end;procedure TfrmDBini.Edit3KeyPress(Sender: TObject; var Key: Char);
    begin
     if (Key=#13) or (key=#9) then bsSkinButton1Click(nil);
    end;procedure TfrmDBini.FormShow(Sender: TObject);
    var
      DBFile : Tinifile ;
    begin
      DBFile := tinifile.Create(extractfilepath(application.ExeName)+ 'DBConn.ini');
      edit1.Text := DBFile.ReadString('smxycsd','DB_DNS','smxycsd');
      edit2.Text := DBFile.ReadString('smxycsd','DB_User','sa');
      //edit3.Text :=DecryStr(DBFile.ReadString('smxycsd','DB_Password','123456789'), DBFile.ReadString('smxycsd','DB_Password','123456789'));      //解密
      DBFile.ReadString('smxycsd','DB_Password','123456789');
      DBFile.Free;
      Edit1.SetFocus;
    end;end.program smxycsd;uses
      Forms,
      windows,
      inifiles,
      SysUtils,
      Umain in 'Umain.pas' {Frmmain},
      Udm in 'Udm.pas' {DM: TDataModule},
      Ulogin in 'Ulogin.pas' {Frmlogin},
      mycommon in 'mycommon.pas',
      UDBini in 'UDBini.pas' {frmDBini},
      Ustudent in 'Ustudent.pas' {Frmstudent},
      Uzhuanyue in 'Uzhuanyue.pas' {Frmzhuanyue},
      Uclass in 'Uclass.pas' {Frmclass},
      Ukaishileixing in 'Ukaishileixing.pas' {Frmkaishileixing},
      Ukecheng in 'Ukecheng.pas' {Frmkecheng},
      Ustudentgrad in 'Ustudentgrad.pas' {Frmstudentgrad},
      Uoperator in 'Uoperator.pas' {Frmoperator},
      Uupdatapw in 'Uupdatapw.pas' {frmupdatapw};{$R *.res}
    var
      DBFile : Tinifile ;
      DB_DNS,DB_User,DB_Password : string ;
      FrmDbini : TfrmDBini ;
    begin
      Application.Initialize;
       Application.Title :='三明学院计算机系学生学籍成绩管理系统1.0';
      Application.CreateForm(TFrmmain, Frmmain);
      Application.CreateForm(TDM, DM);
      Application.CreateForm(TFrmoperator, Frmoperator);
      Application.CreateForm(Tfrmupdatapw, frmupdatapw);
      DBFile := tinifile.Create(extractfilepath(application.ExeName)+ 'DBConn.ini');
      DB_DNS := DBFile.ReadString('smxycsd','DB_DNS','smxycsd');
      DB_User := DBFile.ReadString('smxycsd','DB_User','sa');
      //DB_Password := DecryStr(DBFile.ReadString('smxycsd','DB_Password','123456789'), DBFile.ReadString('smxycsd','DB_Password','123456789'));      //解密
      DB_Password :=DBFile.ReadString('smxycsd','DB_Password','123456789');
      DBFile.Free;
      DM.ADO.ConnectionString :='Provider=SQLOLEDB.1;Password=' +
          DB_Password + ';Persist Security Info=True;User ID=' +
          DB_User + ';Initial Catalog=smxycsd;Data Source=' + DB_DNS ;
      try
        DM.ADO.Connected := true ;
      except
      end;
      while not DM.ADO.Connected do
     begin
       if MessageBox(Application.Handle,'联接数据库服务器失败,是否重新配置连接?','提示',MB_YESNO + mb_iconinformation) = 7 then
            break
        else
         begin
           FrmDBini := TFrmDBini.Create(nil);
           FrmDBini.ShowModal;
           FrmDBini.Free;
           DBFile := tinifile.Create(extractfilepath(application.ExeName)+ 'DBConn.ini');
           DB_DNS := DBFile.ReadString('smxycsd','DB_DNS','smxycsd');
           DB_User := DBFile.ReadString('smxycsd','DB_User','sa');
           //DB_Password := DecryStr(DBFile.ReadString('smxycsd','DB_Password','123456789'), DBFile.ReadString('smxycsd','DB_Password','123456789'));      //解密
           DB_Password := DBFile.ReadString('smxycsd','DB_Password','123456789');
           DBFile.Free;
           DM.ADO.ConnectionString := 'Provider=MSDASQL.1;Password=' +
           DB_Password + ';Persist Security Info=True;User ID=' +
           DB_User + ';Initial Catalog=smxycsd;Data Source=' + DB_DNS ;
           try
                 DM.ADO.Connected := true ;          except            end;
                      end;
                            end;
      if DM.ADO.Connected then
      begin
        Application.CreateForm(TFrmlogin, Frmlogin);
        Frmlogin.ShowModal;
        if Frmlogin.logined then
         Application.Run;
      end ;
    end.
      

  2.   

    先写好一个database.ini 文件,内容如下:
    [Dbinfo]
    Host='主机名'
    User='用户名'(这里用sa)
    Passwd='密码'
    Database='数据库名'在程序中添加如下代码:
    var
      dbini: TIniFile;
      Host:   string;
      User:   string;
      Passwd: string;
      database: string;
    begin
      dbini := TIniFile.Create('.\database.ini');
      Host  := dbini.ReadString('Dbinfo','Host','127.0.0.1');
      User  := dbini.ReadString('Dbinfo','User','sa');
      Passwd:= dbini.ReadString('Dbinfo','Passwd', '');
      Database := dbini.ReadString('Dbinfo','Database','');
      dbini.Free;  ADOConn.ConnectionString := 'Provider=SQLOLEDB.1;Password=' + Passwd +
                                  ';Persist Security Info=True;User ID=' + User +
                                  ';Initial Catalog=' + database +
                                  ';Data Source=' + Host +
                                  ';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=' + Host +
                                  ';Use Encryption for Data=False;Tag with column collation when possible=False';
      ADOConn.Connected := True;
    end;就可以动态链接服务器上数据库了
      

  3.   

    这段代码应该放在那个文件里,是启动那个窗件吗?还是创造一个Unit
      

  4.   

    这样的话 偶一般是做一窗体 上面列出所有局域网上可用的SQL 让用户选 
    然后生成STRING 赋给ADOConnection  如果你可以自动获得的话 写在数据模块的创建事件里也不错
      

  5.   

    把那个ADO.ConnectionString 字符串拆分成几个部分,然后写到注册表或则INI文件,要的时候调用就可以了,这样也可以修改它。
      

  6.   

    procedure ConnectDataBase(ServerName,DatabaseName,UserName,PassWord:string);
    var
       Database1:TDataBase;
    begin
    Database1.DatabaseName:='Test';
    Database1.DriverName:='MSSQL';
    LoginPrompt:=False;
    with Database1.Params do
    begin
    add('DATABASE NAME='+DatabaseName);
    add('SERVER NAME='+ServerName);
    add('USER NAME='+UserName);
    add('OPEN MODE=READ/WRITE');
    add('SCHEMA CACHE SIZE=8');
    add('BLOB EDIT LOGGING=');
    add('LANGDRIVER=');
    add('SQLQRYMODE=');
    add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
    add('DATE MODE=0');
    add('SCHEMA CACHE TIME=-1');
    add('MAX QUERY TIME=300');
    add('MAX ROWS=-1');
    add('BATCH COUNT=200');
    add('ENABLE SCHEMA CACHE=FALSE');
    add('SCHEMA CACHE DIR=');
    add('HOST NAME=');
    add('APPLICATION NAME=');
    add('NATIONAL BCD=FALSE');
    add('TDS PACKET SIZE=4096');
    add('BLOB to CACHE=64');
    add('BLOB SIZE=32');
    add('PASSWORD=' +PassWord);
    end;
    try
    Database1.Connected:=true;
    Query1.DatabaseName='Test';
    Except
    Application.MessageBox('数据连接错误','错误',MB_OK+MB_CONNERROR);
    end;
    end;
    end.