delphi 三层开发经验汇总

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的驱动完成多表更新.

 

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
随便说说最近项目中的三层架构吧。讲点实际的东西。我最讨厌空讲道理。网上讲道理的太多了,不喜欢举例子。 大多数文章中都或多或少的讲到了三层架构。表示层,业务层,数据层。又把业务层再细分,分为外观服务层,主业务服务,及数据库库服务层。 今天主要讨论一下业务层吧。举个最简单的例子。客户端获取数据。 业务层要与表示层尽量解藕, 我的方法是:首先我们在中间层TLB_中定义一个接口 IBusinessService, 定义一个方法。getvoList,我要得到一个VO的列表, VO即ValueObject, 例如:TValueObject= class(TPersistent) private b_insertFlag :Boolean; b_updateFlag :Boolean; b_deleteFlag :Boolean; d_rowVersion :double; procedure setInsertFlag(pInsertFlag :Boolean); function getInsertFlag: Boolean; procedure setUpdateFlag(pUpdateFlag :Boolean); function getUpdateFlag: Boolean; procedure setDeleteFlag(pDeleteFlag :Boolean); function getDeleteFlag: Boolean; procedure setRowVersion(pRowVersion :double); function getRowVersion:double; protected function GetOLEData: OleVariant; virtual; procedure SetOLEData(const Value: OleVariant); virtual; published property bInsertFlag: Boolean read getInsertFlag write setInsertFlag; property bUpdateFlag: Boolean read getUpdateFlag write setUpdateFlag; property bDeleteFlag: Boolean read getDeleteFlag write setDeleteFlag; property dRowVersion: double read getRowVersion write setRowVersion; property POLEData:OleVariant read GetOLEData write SetOLEData; end;TUserVO = class(TValueObject) private id: string; name: string; password: string; 。。。。。。。。。。 VO的列表:TValueObjectList = Class(TObjectList) private ValueObject: TValueObject; ClassName: TClass; procedure setClassName(pTmpClsName :TClass); function getClassName: TClass; procedure setValueObject(pTmpVO :TValueObject); function getValueObject: TValueObject; protected function GetOLEData: OleVariant; virtual; procedure SetOLEData(const Value: OleVariant); virtual; published function AddItem(index: integer; AObject: TObject ):Integer; virtual; function GetItem(index, itemid: integer ): TObject; virtual; function CountItem:Integer; virtual; public constructor Create; virtual; destructor Destroy; override; procedure AfterConstruction; override; property PClassName: TClass read getClassName write setClassName; property POLEData: Ole
### 回答1: Delphi XE10是一种集成开发环境(IDE),可用于创建跨平台的应用程序。跨平台三层http是指在Delphi XE10中使用三层架构进行跨平台的http通信。 三层架构是一种软件设计模式,将软件系统划分为三个层次:表示层、业务逻辑层和数据访问层。在跨平台的应用开发中,三层架构可以帮助开发人员将应用程序的逻辑和数据访问与UI(用户界面)分离,以便在不同的平台上进行部署和使用。 Delphi XE10提供了强大的组件和工具,可以轻松地实现跨平台的http通信。通过Delphi XE10的http组件,开发人员可以在应用程序中发送和接收http请求和响应。这使得应用程序能够与web服务器进行通信,并使用http协议获取和传输数据。 使用Delphi XE10的跨平台三层http通信,开发人员可以方便地在不同的平台上开发和部署应用程序,无论是在Windows、Mac还是移动设备上。由于Delphi XE10的http组件具有高度可定制性和灵活性,开发人员可以根据自己的需求进行扩展和定制,以实现更复杂的http通信功能。 总之,Delphi XE10提供了跨平台三层http通信的解决方案,为开发人员在各种平台上创建功能强大的应用程序提供了便利。无论是进行数据传输还是与web服务器进行通信,Delphi XE10的强大功能和易用性为开发人员提供了更好的开发体验。 ### 回答2: Delphi XE10是一款强大的集成开发环境(IDE),可以用于跨平台开发。它支持多个操作系统,包括Windows、Mac、iOS和Android等,并且可以轻松实现跨平台的HTTP通信。 跨平台三层HTTP是一种常见的应用架构模式,用于在客户端和服务器之间通过HTTP协议进行通信。它将应用程序分为三层:表示层、业务逻辑层和数据存储层。 表示层负责呈现用户界面,并与用户进行交互。Delphi XE10提供了丰富的用户界面设计工具,可以使用可视化方式设计跨平台的界面,并实现与用户的交互操作。 业务逻辑层是应用程序的核心,负责处理业务逻辑和数据处理。Delphi XE10内置了强大的编程语言和框架,可以轻松实现业务逻辑的处理和数据管理。开发人员可以使用Delphi XE10提供的组件和功能,编写业务逻辑代码,并进行数据处理和操作。 数据存储层负责管理和存储数据。Delphi XE10支持多种数据库连接,可以轻松实现与不同数据库的数据交互。开发人员可以使用Delphi XE10提供的组件和工具,连接到数据库,并进行数据的读取、写入和管理。 总结来说,Delphi XE10是一款强大的跨平台开发工具,可以实现三层HTTP架构模式。它提供了丰富的界面设计工具、强大的编程语言和框架,以及灵活的数据库连接功能,使开发人员可以轻松构建跨平台的应用程序,并实现与服务器的HTTP通信。 ### 回答3: Delphi XE10是一种集成开发环境(IDE),用于创建跨平台应用程序。它支持创建三层架构的应用程序,并可以使用HTTP协议进行数据传输。 跨平台三层意味着应用程序的架构被分为三个层次:表示层、业务逻辑层和数据访问层。在Delphi XE10中,开发人员可以使用不同的界面设计工具创建用户界面,例如FireMonkey和VCL。这些界面可以在不同的操作系统上运行,例如Windows、iOS和Android。 业务逻辑层是应用程序的核心部分,用于处理业务逻辑和数据处理。通过使用Delphi XE10的对象导向编程语言,我们可以编写适应不同平台的代码逻辑,以便应用程序在各个平台上都能正常运行。 数据访问层负责与数据库进行交互,从中读取和写入数据。Delphi XE10支持许多数据库引擎,例如MySQL、SQLite和Oracle。通过使用Delphi XE10提供的数据访问组件,开发人员可以轻松地建立与数据库的连接,执行查询和更新数据。 在跨平台三层架构中,HTTP协议用于实现不同层之间的数据传输。开发人员可以使用Delphi XE10提供的HTTP客户端组件进行数据的发送和接收。这种方式可以在不同的平台上实现数据的交换,使得应用程序能够跨平台运行。 总的来说,Delphi XE10支持开发跨平台的三层架构应用程序,并提供了HTTP协议进行数据传输。这使得开发人员能够在不同的操作系统和平台上创建功能强大的应用程序,并能够方便地处理业务逻辑和与数据库的交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值