Multi-Tier结构程序开发基础教程 (一.1)
作者:z33
鉴于同学们刚接解Delphi,并对老师上课所讲的Multi-Tier结构编程不是十分理解,所以我写了下面一个教程,给我最好的同学们,希望这篇教程能帮助同学们更好的学习Delphi,不要掉队,也希望我通过写一写学习的经验,总结一下,对Delphi有更深的了解。
多层开发的基本概念我不想多说了,我只把写一下它的这实现过程。
一、首先编写应用程序服务器,这个服务器的作用是连接数据库和客户端,起到承接客户端和数据库服务器之前的桥(暂且叫它桥吧)。
1、新建一个工程,
File - New - Application 。
2、再往新建的工程上放一个实现多层的“远程数据模板”(中文我觉得应该叫这个),
File - New - Other -Multitier - Remote Data Module - 单击OK。
3、接上一步,会出现一个对话框,
名字起好了填上去点OK就可以了。
上图中,CoClass Name就是此程序的名称,叫COM的名称,这个名称最好起一个有意义名字,因为在你做客户端的时间需要依据这个名字连接到这个服务器。比如是:multi_test(意思是多层测试)或者 X_test ,好记~而且酷!。
{下面灰色字这一段不需要看懂
下面的Instancing选择服务器的处理线程方式,现在选的是Multiple Instance是指多前客户端可共享一个线程应用程序服务器。还有Single Instance是多对多的处理方式,就是一个客户端对应一个线程应用程序,当多客户端时,服务端也会开和客户端一样多的线程运行,好处是各线程相对独立,不会相互影响,但相对比较占资源。而Internal是创建一个In-Process的COM程序(DLL文件格式),这项用得比较少,据我理解是需要和其它对象兼容而设的,这是我的理解,有不同看法欢迎讨论。
最后一个Threading Model是用它设置In-Process COM程序的多任务模式的,太多了,懒得讲了,大家自己看书吧。}
4、 继续干!拖一个Table1组件到Form1上去,设置Table1的DatabaseName为DBDEMOS,Table Name为Customer.db。(这部分是基础,我不多讲了,不懂去学学前面的知识。)再拖一个DataSetProvider1组件(不要问我ClinentDataSet组件在哪个栏里,自已找!),并设置它的DataSet属性为Table1。这里DataSetProvider组是向客户端提供数据集的接口。DataSetProvider(数据集提供者),DataSet属性是设置它的数据集是什么,这里指向Table1这个数据集。弄好了这些,我们的服务器就完成了,接下来运行即可,运行的目的是让服务器在系统中注册。
(另外你也可以在Form1上添一个Label标签,标识一下,如下图:
5、保存工程。
二、 编写客户端应用程序
1、新建一个工程。
File - New - Application
2、拖一个TDCOMConnection控件到Form1上(还是那句话,不要问我它在哪儿)。
把它的ComputerName属性设成127.0.0.1,这里要说明一下:
ComputerName这个属性是设置你要连接的服务器,填上127.0.0.1就是自己的机器,因为要在自己的机器上调试嘛。当然如果希望连到别的机器上也可以,当然前提是别的机器有已经做好并注册运行的Application Server ,简单说就是上面咱们做的应用程序服务器。举个例子,如果你要在我的机器上有已经做好并运行的Application Server,那么我的机器名是c2109,你就可以在ComputerName里填上我的c2109这个计算机名就可以连到我的机器操作了。当然也可以填IP地址,因为有些计算机名可能会引起错误,比如“可乐猫”的计算机名,好像就是“可乐猫”,中文名呀,你敢用吗?我不敢,还是用IP连接吧,是不是?
然后,再去设置ServerName的属性,这个属性里面你会找到你刚才建立的服务器名称,忘了?回去看看。
3、再拖一个TClientDataSet控件,把RemoteServer属性设置为DCOMConnection1,再把Provider属行选为DataSetProvider1。注意,当你点上Provider属性时,应用程序服务器将会被启动。(这时不要把那个服务器的窗口关掉,留着它,不然会出错!)
如下图:
4、接着拖一个TDataSource和TDBGrid,TDBNavigator到Form1上,设置DataSource1的DataSet属性为:ClientDataSet1,并把DBGrid1和DBNavigator1的DataSource属性设置为:DataSource1,最后把ClientDataSet1的Active属性设置为:True,激活。
5、保存工程,并运行,至此这个简单的Mulit-Tier已经好了,你学会了吗?
最终效果如图:
这一节里,其实我应该讲一下ActionList的Standard action来实现DBNavigator的工能,因为本节所讲的并没能真正的实现它的ClientDataSet的ApplyUpdates的功能,也就是说不能提交数据,但现在我该睡觉了,所以剩下的留到下一节去讲吧。如果你觉得我讲的有问题,哪个地方讲错了,欢迎来找我讨论,大家一起学习,最后。。。。希望大家都能看明白。呵呵~
对了,还有就是多层的数据库异常处理,虽然老师演示了一下,但我仍然有些地方不明白,想老师新建的那一个Reconcile Error Dialog来做异常处理我觉处理没什么价值,而且不合理,等我再研究研究。:)
Multi-Tier结构程序开发基础教程 (一.2)
作者:z33
上一节只讲了Multi-Tier的连接,其实上一节就应该把这个一起都讲了,但因为时间有限,所以分成两部分讲了,呵呵~。
因为Multi-Tier结构和普通单机对数据库操作是不一样的,我们也就无法用单机的方法往数据库里写数据,这一节就讲一下在多层结构下对数据操作。
我们要再利用上第一节的程序,这次要往上放一些对数据操作的功能。
一、首先现在我们不用DBNavigator1,而用ActionList控件来实现数据的操作,,我们还需要自己建5个铵钮,并通过ActionList的Standard Action来实现这些功能。
1、往Form1上放5个铵钮,再拖一个Standard控件栏的最后一个控件:ActionList控件,这个控件是帮助我们快速完成铵钮功能的控件,如图:
下面我们来实现它:
a.双击ActionList控件,出现Editing Form1.ActionList1窗口,在窗口左半部空白处点鼠标右键,再选“New Standard Action...”项,如图:
b. 出现了Stand Action列表,我们在里面找到DataSet项,把这项里的所有子项都选上,再点OK,如图:
c.再设置每个按钮的Action属性为对应的Action预置功能。如下表:
铵钮
Action属性
实现功能
Button1
DataSetInsert1
插入一条数据
Button2
DataSetEdit1
编辑当前记录
Button3
DataSetDelete1
删除当前记录
Button4
DataSetCancel1
取消当前操作
Button5
不设置
把修改写入数据库(Caption:=写入)
d. 把每个铵钮的Caption 相对应功能的名称即可。如图:
e. 双击“写入”按钮,在里面写入如下加粗的语句就可以实现向数据库提交修改:
procedure TForm1.Button5Click(Sender: TObject);
begin
clientdataset1.ApplyUpdates(0);
showmessage('已经成功写入数据库中');
end;
其中ApplyUpdates是ClientDataSet的方法(method),功能是提交客户端数据到服务器端,括号里的0表示发生错误的最大值为0,即不允许有错误。
到这里咱们的第一节就完了, 我该去洗洗睡了~~,这次没讲多少东西,最主要的就是那个写入铵钮的clientdataset1.ApplyUpdates(0);这个语句才能实现向数据库提交数据。
下一节讲一下Multi-Tier的Transaction(事务处理),服务器响应机制和错误处理机制。