三层服务器程序源码样例

一、三层服务器程序的建立
提前说明:
(1)建立一个基本的服务器程序和一个客户端程序,返回一个动态查询的数据给客户端。
(2)服务器上的Query1的SQL语句是从客户端传过来的。
(3)基于BDE和Oracle数据库的三层。


1、新建立一个项目,在项目加入一个远程数据模块“Remote Data”,名称为:ZDRHYJServer。
2、在ZDRHYJServer中加入一个DataBase1控件,并设置其Name为:ZDRHYJServerDatabases,
双击DataBase1控件,在弹出的窗口中,去除窗口中的“Login prompt”(否则激活时会出现登录窗口),
选择“Driver name”为“Oracle”,然后单击“Defaults”,在编辑框中设置其属性如下:
SERVER NAME=ORAdb_11
USER NAME=hyj
NET PROTOCOL=TNS
OPEN MODE=READ/WRITE
SCHEMA CACHE SIZE=8
LANGDRIVER=
SQLQRYMODE=
SQLPASSTHRU MODE=SHARED AUTOCOMMIT
SCHEMA CACHE TIME=-1
MAX ROWS=-1
BATCH COUNT=200
ENABLE SCHEMA CACHE=FALSE
SCHEMA CACHE DIR=
ENABLE BCD=FALSE
ENABLE INTEGERS=FALSE
LIST SYNONYMS=NONE
ROWSET SIZE=20
BLOBS TO CACHE=64
BLOB SIZE=32
OBJECT MODE=TRUE
PASSWORD=hyj
设置完毕后选择“OK”保存。

关于BDE的说明:
(A)、设置服务名、用户名和口令如下:
    SERVER NAME=ORAdb_11  //在使用前要在Oracle中配置一个连接数据库的Oradb_11的服务名。
    USER NAME=hyJ
    PASSWORD=hyj
(B)、如果DataBase1控件设置正确,在DataBase1的属性窗口中,双击其“Connectioned”属性,即设置为True,激活DataBase1连接。
    如果设置错误,将弹出“未连接到Oracle”的错误信息。
(C)、最后部署时时,可能必须设置Connectioned为False,否则出错。
(D)、系统将自动创建一个*_TLB.pas文件。(该文件在进行服务器上的函数打包时很有用,详见下面的内容。)

3、在数据模块中加入一个查询Query1,该控件用于接收客户端传来的SQL语句,并执行查询。
设置其Databasesname属性为:ZDRHYJServerDatabases。
由于其SQL语句从客户端传入,所以不用设置其SQL语句。
说明:
(A)由于Query1的SQL语句是从客户端传来的,所以对于各种临时的查询采用这种方法很管用。可以执行任何查询。
(B)如果只执行一个SQL语句,就可以把SQL语句写死在其SQL属性中。

4、加入一个DataSetProvider1控件,该控件用于和客户端建立。设置其DataSet属性为:Query1。
在DataSetProvider1的“Option”属性下,有很多的设置内容,要从客户端接收SQL语句,
必须设置其PoAllowCommandText为True(这一点很重要,否则提示出错信息)。
5、加入一个ListBox1控件,该控件用于显示连接数据库的信息。
6、编译程序,到此服务器程序建立完毕,运行该程序。(说明:此时可以不用运行scktsrvr.exe程序。)
7、三层程序的部署要注意的问题:
(1)部署服务器程序时,要在服务器要重新编译、运行才行(服务器必须安装Delphi7程序)。

(2)为了使程序安全运行,其端口号建议在4000以上,以免端口被其它程序占用出现错误。
到此,一个基本的服务器程序建立完毕。

二、客户端程序的建立。
  提前说明:
(1)客户端数据模块中采用DCOMConnection控件和远程的数据模块建立连接。
(2)

1、新建一个工程,添加一个数据模块:(File/New/Data Module)
2、在数据模块中添加一个DCOMConnection1控件(在 DataSnap控件页中),用于和远程的数据模块建立连接。
(1)设置DCOMConnection1的属性:
在“ComputerName”后单击按钮,弹出“浏览计算机”窗口,从中选择部署有服务器程序的“计算机名”,
(如:Zdr-qn30vok6sxt),也可以直接输入服务器的IP地址,如:192.168.4.4
(2)设置ServerName属性:
单击ServerName属性后的小箭头,弹出上面的计算机中所有的服务名,从中选择“HYJMYServer.ZDRHYJServer”,
此时,“ServerGUID”将自动显示出来。
(3)激活远程数据模块:
如果远程服务器程序没有运行,设置DCOMConnection1的“Connectioned”属性不true时,将自动激活服务器端程序 。
3、在数据模块中添加一个ClientDataSet1控件(在Data Access控件页上),用于给服务器的远程数据模块中传递SQL语句,
并接收服务器上的Query1执行查询后返回的数据。
设置ClientDataSet1属性如下:
RemoteServer属性为:DCOMConnection1
ProviderName属性为:DataSetProvider1
(说明:先设置DCOMConnection1的Connectioned为False,当单击ProviderName后的小箭头时,
将自动激活服务器端程序,并列出可选的服务器端程序的所有的DataSetProvider控件列表)
此时,运行客户端程序,可自动激活服务器端程序。
4、在数据模块中添加一个DataSource1控件,设置其DataSet属性为ClientDataSet1,
该控件用于将返回的数据提供给下面的DBGrid1控件。
5、添加一个DBGrid1控件,用于显示返回的数据。在主窗口的Uses中加入数据模块:uses ClientDM;
设置DBGrid1控件的DataSource属性为:DataModule1.DataSource1。
6、到此,客户端程序的设置完毕,编译程序。

三、客户端程序的运行。
  提前说明:
(1)在上面的程序中,建立了服务器程序和客户端程序,但查询的SQL语句没有输入,
在下面,我们通过客户端主窗口的一个按钮来传递一个SQL语句给服务器上的Query1,并将查询的结果显示出来。
(2)
1、在窗口的SHOW事件中添加代码如下:
procedure TFrmClientMain.FormShow(Sender: TObject);
begin
  try
  if not ClientDM.DataModule1.DCOMConnection1.Connected then
 ClientDM.DataModule1.DCOMConnection1.Connected;
 except
   showmessage('数据库连接“ClientDM.DataModule1.DCOMConnection1.Connected”时出错!!');
 abort;
 end;
 memo1.Text:='select * from Cust_info where Custname like '+#39+'%众%'+#39;
end;

2、新建一个按钮,在其Caption为:“动态SQL查询”。双击按钮,输入代码如下:
procedure TFrmClientMain.Button1Click(Sender: TObject);
begin
 ClientDM.DataModule1.ClientDataSet1.close;
 ClientDM.DataModule1.ClientDataSet1.CommandText:=edit1.Text;//
 ClientDM.DataModule1.ClientDataSet1.Open;
 FrmClientMain.DBGrid1.DataSource:=ClientDM.DataModule1.DataSource1;
 FrmClientMain.Label1.Caption:='查询的记录总数为:'+inttostr(ClientDM.DataModule1.ClientDataSet1.RecordCount);
end;
3、运行客户端程序,点击按钮查询后,在Dbgrid1表格显示出查询的数据。

说明:此处有个奇怪的问题:
如果在服务器的Query1中,如果没有设置SQL语句,在运行客户端时就会出现“No SQL StateMent available”的错误,
如果先设置该SQL语句如:“select * from cust_info”,运行一次客户端后(也可能是服务器程序),再删除该SQL语句,就不会出现错误了。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值