delphi 三层开发经验汇总

转载 2010年02月22日 22:59:00

delphi很早就已经可以进行三层的开发了. 但一直到现在, 网上这方面的东西太少 了. 要么太老, 甚至不完全正确.  例如:

如 何进行多表更新(提交), 很多回复还是说用ADOConnection的事务, (如果要同时更新SQL SERVER和Oracle数据库的表怎么 办).
当然也有说用SetComplete, SetAbort的. 但说的很简单, 其中的注意事项又是什么呢. 还有的推荐看李维的那本分布 式开发的书. 那本书中是写了很多值得学习和了解的东西. 但有些东西已经过时了或者说的不详细, 例如win2000中已经有COM+了. COM+已 经整合了mts及其它一些东西了. 另个, 也有些贴子上有人说, 应用服务器上只用一个TDataSetPrivoder和一个 TDataSet(ADO, Query, DBXQuery之一)就可以了. 但具体怎么用呢?又看不到下文. 

另外, 还有一些朋友 在用第三方的一些控件. 我看了一下, 大多就像个嵌入到IE中的ActiveX, 感觉也没有什么意思---直接弄个ActiveX到IE中就不行了.

 

 

1. 如何只用一个TDataSetPrivoder和一个TADOQuery.

 

delphi的TRemoteDataModule集成了IAppServer接口.并且实现了IAppServer接口的方法:

 

 

在应用服务器上, 只需要用这几个方法就可以了. 
示例:unit Unit2;

 

 

说白点, 就是根据client端传来的表名. 动态的改变应用服务上的ADOQuery中的语句即可. 上面的例子中, 应用服务上只加入了两上方法 GETDATA, POSTDATA两个方法, 也可以为每个表都加入对应的GET和POST方法, 那么就不需要TABLENAME参数了.对于各户端 来说, 只知道应用服务中IAPPSERVER接口加入的方法就行了.

 

 

 

发现一个问题.用ADO连接到SQLSERVER时时候, 如果有类似下面的代码:

ADOQuery1.SQL.Text := 'update table set f1=:f1, f2=f2, f3:=f3';
ADOQuery1.Parameters[0].Value := 'a';
ADOQuery1.Parameters[0].Value := 'b';
ADOQuery1.Parameters[0].Value := 'c';

设 置每一个参数值的时候.会有 
update table set f1=' ' where 1=2
update talbe set f2=' ' where 1=2
update talbe set f3=' ' where 1=2
在 SQLSERVER被编译. (我通过事件探查器发现的, 即使没有执行ADOQuery1.ExecSQL)
所以建议在应用服务器上直接拼成 (update table set f1=a, f2=b, f3=c)来执行会更好一些.

如果有image字段.改成text类型更 好一些.(好拼SQL语句).

客户端尽量多做一些工作,减轻应用服务器的负担也是应该考虑的.客户端给应用服务器的数据,尽量是 DELTA. 即有字段信息,也有数据信息,客户端也可以少写些代码.

当前手上的程序.应用服务器上有两上COM+对象, 一个是用来查 询, 一个是用来更新.效率还是很好的.

 

 

在COM+/MTS中的一点注意事项。

SetAbort并不同于RollbackTrans 

SetComplete不 同于CommitTrans

SetAbort并不会导致事务立即回滚。只有在根对象失活(不一定是销毁)的时候,如果有一个对象调用了 SetAbort,才会回滚事务。

假如A对象创建了B对象,B创建了C对象。 也就是只有在A对象失活的时候。会检查是不是有对象进行了 SetAbort.如果有,就会取消执行的操作。

另外。在Create中进行某些初始操作要注意COM+被放到池中的情况,最好在 OnActivate, OnDeactivate中进行。

有时候COM+对象的Create文件根本不会被调用。

如果 你的COM+对象一定要在事务所中执行。调用IsInTransaction,如何不返回true, 就终止。

 

COM+对象在建立的时候,可以指定一个事务环境。
所以 应用服务器上有两上COM+对象, 一个是用来查询, 一个是用来更新.
可以更 好的考虑考虑了。

 

多表更新.只要将DataSetProvider.ResolveToDataSet:=True;就可以了.说明是使用ADO的驱动完成多表更新.

 

待续............

delphi三层架构

这是我多年前在深圳工作时写的,现在都迁移来CSDN上,免的丢失了。       三层架构指的是界面,业务逻辑和数据存储分离,不是指物理上是否分离。       这样做的好处是层...

检测鼠标键盘多久没有活动

DELPHI代码 function GetInputAwayTime():DWORD; var lpi:TLastInputInfo; begin lpi.cbSize := sizeof(l...

delphi 三层开发经验汇总

delphi很早就已经可以进行三层的开发了. 但一直到现在, 网上这方面的东西太少 了. 要么太老, 甚至不完全正确.  例如: 如 何进行多表更新(提交), 很多回复还是说用ADOConnectio...
  • csli888
  • csli888
  • 2011年01月15日 10:16
  • 341

Delphi的三层开发初学经验

在数据库开发方面Delphi相对于其他众多开发工具其优势在于灵活快速,且十分稳定。本实例使用Remote DataModule(远程数据模块)创建。 服务端:   首先让我们来编译服务器端,打开D...

Delphi的三层开发初学经验

近日闲来无事,看了写有关Delphi的书,发现有关三层的书都一样简单略过,网上搜索了一下也是零零碎碎,经过简单实验测试了一下内容。 在数据库开发方面Delphi相对于其他众多开发工具其优势在于灵活快速...

Delphi XE之路(13)开发数据库三层应用的DataSnap

我觉得Delphi最强大的的功能之一就是开发数据库三层应用的DataSnap,在Android上的实现,首先是完成服务器的设计: (1)利用向导完成DataSnap服务器的框架,如下图: ...
  • 5201314
  • 5201314
  • 2014年12月22日 16:22
  • 2160

Delphi三层开发小技巧:TClientDataSet的Delta妙用

Delphi三层开发小技巧:TClientDataSet的Delta妙用   Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDat...

Delphi三层数据库开发应用

====================================================== 注:本文源代码点此下载 =============================...

Delphi 三层框架开发客户端开发

新建一个application 如图 添加以下控件 代码如下
  • gykthh
  • gykthh
  • 2014年10月24日 15:04
  • 3538

Delphi三层开发小技巧:TClientDataSet的Delta妙用

Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好...
  • aroc_lo
  • aroc_lo
  • 2013年07月29日 16:30
  • 818
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delphi 三层开发经验汇总
举报原因:
原因补充:

(最多只允许输入30个字)