请教三层问题 ( 积分: 100 )

  • 主题发起人 主题发起人 jeansonliu
  • 开始时间 开始时间
J

jeansonliu

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟刚开始学习三层开发,不知哪位大虾能够提供给小弟一个三层结构的程序源码,万分感谢!
 
小弟刚开始学习三层开发,不知哪位大虾能够提供给小弟一个三层结构的程序源码,万分感谢!
 
http://www.delphifans.com/SoftView/SoftView_322.html
http://www.delphifans.com/SoftView/SoftView_106.html
 
你看看我的笔记吧!!
http://www.delphibbs.com/keylife/iblog_show.asp?xid=14872
Delphi7三层操作笔记--服务器和客户端程序的建立

一、三层服务器程序的建立
提前说明:
(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语句,就不会出现错误了。
 
zdr690929 这个例子不错。慢慢写,不懂在提问或者全文检索一下。
 
谢谢各位!!!
 
多人接受答案了。
 
后退
顶部