注册 登录
编程论坛 Delphi论坛

动态连接SQL数据库

yangguofa 发布于 2004-06-01 09:45, 4660 次点击
我们在使用Delphi编写以Micorsoft SQL Server为后台数据库的时候,经常为程序的发布担忧:
我们怎样才能让用户自由设置数据库参数,程序自动连接? 笔者经过多次试验,使用Delphi自带的
DataBase数据库连接控件可以很好的实现SQL数据库的自动连接。实现方法如下:

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);     //ServerName也可以是SQL服务器的IP地址
      Add(’USER NAME=’ + UserName);         //设置MSSQL数据的用户名称 如:sa
      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 LANG NAME=’);
      Add(’ENABLE BCD=FALSE’);
      Add(’TDS PACKET SIZE=4096’);
      Add(’BLOBS TO CACHE=64’);
      Add(’BLOB SIZE=32’);
      Add(’PASSWORD=’ + PassWord);        //设置MSSQL用户口令;
   end;
   try
     Database1.Connected := true;
     Query1.DatabaseName := ’Test’;
     ...   //数据库查询
   
   Except
     Application.MessageBox(’数据库连接错误!’,’错误’,MB_OK+MB_ICONERROR);
   end;
end;
13 回复
#2
我是菜鸟2004-06-02 14:16
这种方法不太让人理解。。
#3
hanpengshan_002004-07-27 13:08

其实也没有必要设置这么多参数

另外数据库的用户名和密码应该加密后保存到ini文件中(不要保存到注册表里)

#4
囡囡2004-11-10 15:06
请问,如果我用ado的话,有能动态的连接数据库的方法吗
#5
rozenja2004-11-22 21:59

好像这样讲对于我们这些新手来说

是很难理解的

#6
zyloveln2004-11-29 14:12
有没有好用的例子或书籍介绍一下
#7
wuheng2004-12-02 16:46

写的不错。顶,如果能介绍一下动态连SQL时候connectionstring的参数怎么设置就更好了。

我一直在研究这个问题。

#8
plzmj20012005-01-14 08:55
正在写这一文章。。。。
数据库的恢复与备份。
主要是解决开发中的恢复内容 。。。。
#9
handle2005-01-28 16:29
wait..
#10
shuyue19812005-01-31 12:04
关注!
#11
shede2005-03-06 11:25
我使用动态参数连接的时候为什么说错误的呢?我跟前面的设置方法一样的啊?在调试的时候给出错误,我在调试的时候还没有写其他的窗口代码?那个告述我是什么原因?谢谢!
#12
王万林2013-08-20 15:29
unit Uregister;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,inifiles, ExtCtrls;

type
  TFregister = class(TForm)
    Image1: TImage;
    EWMIS_ServerName: TEdit;
    EWMIS_loginName: TEdit;
    EWMIS_PWD: TEdit;
    EWMIS_DbsName: TEdit;
    EYH_ServerName: TEdit;
    EYH_loginName: TEdit;
    EYH_PWD: TEdit;
    EYH_DbsName: TEdit;
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Button3: TButton;
    Button5: TButton;
    procedure FormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure EWMIS_ServerNameChange(Sender: TObject);
    procedure EWMIS_loginNameChange(Sender: TObject);
    procedure EWMIS_PWDChange(Sender: TObject);
    procedure EWMIS_DbsNameChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Fregister: TFregister;

implementation

uses dataMU, ClassesU;

{$R *.dfm}

procedure TFregister.FormShow(Sender: TObject);
Var
myinifile:Tinifile;
begin
myinifile:=Tinifile.create(ExtractFilepath(paramstr(0))+'WmisYH.ini');

EWMIS_ServerName.text := myinifile.ReadString('县级登录参数','服务器名','(local)');
EWMIS_LoginName.text := myinifile.ReadString('县级登录参数','用户名','sa');
EWMIS_PWD.text := myinifile.ReadString('县级登录参数','密码','');
EWMIS_DbsName.text := myinifile.ReadString('县级登录参数','数据库名','pis_base_xj');
EYH_ServerName.text := myinifile.ReadString('业务登录参数','服务器名','(local)');
EYH_LoginName.text := myinifile.ReadString('业务登录参数','用户名','sa');
EYH_PWD.text := myinifile.ReadString('业务登录参数','密码','');
EYH_DbsName.text := myinifile.ReadString('业务登录参数','数据库名','pis_base_YH') ;

end;

procedure TFregister.BitBtn1Click(Sender: TObject);
Var
myinifile:Tinifile;
begin
myinifile:=Tinifile.create(ExtractFilepath(paramstr(0))+'WmisYH.ini');

myinifile.WriteString('县级登录参数','服务器名',EWMIS_ServerName.text);
myinifile.WriteString('县级登录参数','用户名',EWMIS_LoginName.text);
myinifile.WriteString('县级登录参数','密码',EWMIS_PWD.text);
myinifile.WriteString('县级登录参数','数据库名',EWMIS_DbsName.text);
myinifile.WriteString('业务登录参数','服务器名',EYH_ServerName.text);
myinifile.WriteString('业务登录参数','用户名',EYH_LoginName.text);
myinifile.WriteString('业务登录参数','密码',EYH_PWD.text);
myinifile.WriteString('业务登录参数','数据库名',EYH_DbsName.text) ;


end;
procedure TFregister.BitBtn2Click(Sender: TObject);

begin

close;

end;

procedure TFregister.Button1Click(Sender: TObject);
Var
WMISconnstring:string;
begin
WMISconnstring:='Provider=SQLOLEDB.1;Password=' + EWMIS_PWD.Text +
';Persist Security Info=True;User ID=' + EWMIS_loginName.Text +
';Initial Catalog=' + EWMIS_DbsName.Text  + ';Data Source=' + EWMIS_ServerName.Text ;
DataM.ADOConn_base.ConnectionString:=WMISconnstring;
try
datam.ADOConn_base.Connected:=true;
MessageBox(Handle, 'PIS基础数据库连接成功!', '信息', MB_ICONASTERISK);
Button3.Enabled:=true;
except
MessageBox(Handle, 'PIS基础数据库连接失败!', '信息', MB_ICONASTERISK);
Button3.Enabled:=false;
end;
end;
procedure TFregister.Button2Click(Sender: TObject);
Var
YHconnstring:string;
begin
YHconnstring:='Provider=SQLOLEDB.1;Password=' + EYH_PWD.Text+
';Persist Security Info=True;User ID=' + EYH_loginName.Text  +
';Initial Catalog=' + EYH_DbsName.Text  + ';Data Source=' + EYH_ServerName.Text ;
dataM.ADOCONn_YH.ConnectionString:=YHconnstring;
try
dataM.ADOCONn_YH.Connected:=true;
MessageBox(Handle, '业务数据库连接成功!', '信息', MB_ICONASTERISK);
Button5.Enabled:=true;
except
MessageBox(Handle, '业务数据库连接失败!', '信息', MB_ICONASTERISK);
Button5.Enabled:=false;
end;
end;

procedure TFregister.Button3Click(Sender: TObject);
Var
myinifile:Tinifile;
begin
myinifile:=Tinifile.create(ExtractFilepath(paramstr(0))+'WmisYH.ini');

myinifile.WriteString('县级登录参数','服务器名',EWMIS_ServerName.text);
myinifile.WriteString('县级登录参数','用户名',EWMIS_LoginName.text);
myinifile.WriteString('县级登录参数','密码',EWMIS_PWD.text);
myinifile.WriteString('县级登录参数','数据库名',EWMIS_DbsName.text);
myinifile.Destroy;
end;
procedure TFregister.Button5Click(Sender: TObject);
Var
myinifile:Tinifile;
begin
myinifile:=Tinifile.create(ExtractFilepath(paramstr(0))+'WmisYH.ini');
myinifile.WriteString('业务登录参数','用户名',EYH_LoginName.text);
myinifile.WriteString('业务登录参数','密码',EYH_PWD.text);
myinifile.WriteString('业务登录参数','数据库名',EYH_DbsName.text) ;
myinifile.Destroy;
end;
procedure TFregister.EWMIS_ServerNameChange(Sender: TObject);
begin
datam.ADOConn_base.Connected:=false;
end;

procedure TFregister.EWMIS_loginNameChange(Sender: TObject);
begin
 datam.ADOConn_base.Connected:=false;
end;

procedure TFregister.EWMIS_PWDChange(Sender: TObject);
begin
 datam.ADOConn_base.Connected:=false;
end;

procedure TFregister.EWMIS_DbsNameChange(Sender: TObject);
begin
 datam.ADOConn_base.Connected:=false;
end;

end.
#13
王万林2013-08-20 15:33
unit dataMU;

interface

uses
  SysUtils, Classes, DB, ADODB;

type
  TDataM = class(TDataModule)
    ADOConn_base: TADOConnection;
    ADOConn_yh: TADOConnection;
    procedure DataModuleCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DataM: TDataM;

implementation

uses ClassesU,inifiles;

{$R *.dfm}

procedure TDataM.DataModuleCreate(Sender: TObject);
Var
WMISconnstring:string;
YHconnstring:string;
EWMIS:TEsys;
EYH:TEsys;
myinifile:Tinifile;
begin
EWMIS:=TEsys.create;
EYH:=Tesys.create;
myinifile:=Tinifile.create(ExtractFilepath(paramstr(0))+'WmisYH.ini');
EWMIS.ServerName:= myinifile.ReadString('县级登录参数','服务器名','(local)');
EWMIS.useName:= myinifile.ReadString('县级登录参数','用户名','sa');
EWMIS.PWD := myinifile.ReadString('县级登录参数','密码','');
EWMIS.DbsName:= myinifile.ReadString('县级登录参数','数据库名','pis_base_xj');
EYH.ServerName:= myinifile.ReadString('业务登录参数','服务器名','(local)');
EYH.useName:= myinifile.ReadString('业务登录参数','用户名','sa');
EYH.PWD:= myinifile.ReadString('业务登录参数','密码','');
EYH.DbsName:= myinifile.ReadString('业务登录参数','数据库名','pis_base_YH') ;
WMISconnstring:='Provider=SQLOLEDB.1;Password=' + EWMIS.PWD +
';Persist Security Info=True;User ID=' + EWMIS.useName +
';Initial Catalog=' + EWMIS.DbsName + ';Data Source=' + EWMIS.ServerName;
ADOCONN_base.ConnectionString:=WMISconnstring;
YHconnstring:='Provider=SQLOLEDB.1;Password=' + EYH.PWD+
';Persist Security Info=True;User ID=' + EYH.useName +
';Initial Catalog=' + EYH.DbsName + ';Data Source=' + EYH.ServerName;
ADOCONN_YH.ConnectionString:=YHconnstring;
end;

end.
#14
王万林2013-08-20 15:33
unit ClassesU;

interface
type
  TOperator=class
     xzcode:string;
     id:integer;
     OperatorName:string;
     pwd:string;
     OperatorLevel:string;
end;

type
  TEsys=class
     ServerName:string;
     useName:string;
     PWD:string;
      DbsName:string;
End;
implementation

end.
1