Delphi 使用 Datasnap 的几种三层应用技术总结
Delphi 使用 Datasnap 进行三层应用开发,积累了几种技术,总结如下:
1、(推荐!)在 Datasnap 服务端 使用 TDatasetProvider,客户端 使用 TDSProviderConnection
1)采用 Datasnap Server ,可以使用TCP/IP、Http 通信。TDatasetProvider 能够提供 “元数据与业务数据”。
推荐:采用(FireDac技术) TFDConnection 连接数据库,通过 TFDQuery/TFDTable 向 TDatasetProvider 提供数据集;(!执持数据库新版本)
注意:也可以采用(DBX技术)TSQLConnect、TSQLDataSet/TSQLQuery/TSQLTable/TSQLStoredProc,向 TDatasetProvider 提供数据集;
2)客户端使用(DBExpress技术 DBX) TSQLConnection + TDSProviderConnection ==》TClientDataSet ==》TDataSource
TSQLConnection 设置为 DataSnapCONNECTION,驱动 DataSnap;
TDSProviderConnection 设置:TSQLConnection 的实例(驱动 DataSnap);ServerClassName 设置 DataSnap服务端 提供服务的 “类名称”;
TClientDataSet 设置:RemoteServer 为 TDSProviderConnection 的实例,ProviderName 是服务端 的相应“类”下的 TDatasetProvider 实例。
提示1:(1 FRM)TClientDataSet 可以 绑定 TStringGrid ,或者 (2 VCL)通过增加 TDataSource 连接 TDBGrid 。
提示2:客户端 TClientDataSet 的变更,如何返回服务器端,以及客户端数据集的查询、排序、过滤等,
建议参考《Delphi2006-DbExpress高效数据库开发》这本书;《Delphi 10.1 Berlin DataSnap 开发手册》第一章也有介绍本项技术。
3)好像一个TDatasetProvider,只能提供一个Dataset,如果要建立 主Master/从Detail 数据集,需要采用下列方式:
利用 TFDQuery 建立两数据集,一个是 主Master ,另一个的 Masterdata 属性设置为主数据集。
4)(好,供参考!)服务端 可以只用一个:TFDConnection + TFDQuery + TDatasetProvider 向客户端提供数据,
但 TDatasetProvider 的属性 Options 选择 poAllowCommandText 为 True ,即允许 TFDQuery 不管理其SQL 的值,
直接从客户端 接收 SQL ,并向客户端返回 查询数据集。
客户端 的 TClientDataSet 通过 CommandText 属性设置 SQL 命令,可以带参数,并从Params 获取参数值,将SQL发给服务端,并接收返回数据。
这样,可以一个服务端 TDatasetProvider ,服务多个客户端。当然,会话 Session 采用 一次性的比较合适,或者 获取数据完成,断开 SQLConn连接。
参考《DataSnap ClientdataSet 三层中主从表的操作》搞定主从表的设置!!!
2、在 Datasnap 服务端 使用 TFDQuery,客户端 使用 TSQLConnection 或者 TDSRestConnection ,数据交换用 TStream
参考:http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/DataSnap.FireDAC_DBX_Sample (DataSnap 联合 FireDAC)
1)采用 Datasnap Server ,可以使用TCP/IP、Http 通信。
TFDConnection 连接数据库,通过 TFDQuery (设置 + TFDSchemaAdapter) 提供数据集 , ==》TDataSource (主)
通过 TFDQuery (设置 + TFDSchemaAdapter,设置 MasterSource 、MasterFields 为 “主数据源/ID”) 提供数据集 ,
==》TDataSource (从)
公开服务类(Class)的 发送数据集方法 ,以 TStream 类型的方式 ,借助 TFDSchemaAdapter 发送数据,接收更新、并写入数据库。
function TServerMethods.StreamGet: TStream;
begin
Result := TMemoryStream.Create;
try
qCustomers.Close; //主数据集
qCustomers.Open;
qOrders.Close; //从数据集
qOrders.Open;
FDSchemaAdapter.SaveToStream(Result, TFDStorageFormat.sfBinary);
Result.Position := 0;
finally
//
end;
end;
以及 接收方法:
function TServerMethods.StreamPost(AStream: TStream): string;
var
LMemStream: TMemoryStream;
LErrors: Integer;
begin
Result := '';
// 获取 数据流 从客户端 Retreive entire stream from client
LMemStream := CopyStream(AStream); //复制 数据流
LMemStream.Position := 0;
try
FDSchemaAdapter.LoadFromStream(LMemStream, TFDStorageFormat.sfBinary);
LErrors := FDSchemaAdapter.ApplyUpdates
finally
LMemStream.Free;
if LErrors > 0 then
Result := Format(sErrorsOnApplyUpdates , [GenerateErrorMessage]);
end;
end;
2)客户端 可以采用两种 连接方式:1)TSQLConnection (DBX 方式);2)TDSRestConnection (Rest方式)
通过两者(右点)可以 生成 服务端代理类 (Generate Datasnap Client Classes),调用 代理类的方法,获取 服务端数据流。
TFDTableAdapter (+ 同一 TFDSchemaAdapter,设置 DatSTableName 为服务端 的 TFDQuery 名 ) ==》 TMemTable ==》 TDataSource (主 -- 客户)
TFDTableAdapter (+ 同一 TFDSchemaAdapter)设置 DatSTableName 为服务端 的 TFDQuery 名) ==》 TMemTable ==》 TDataSource (从 -- 订单)
如何 获取数据 ,参考 示例!(省略。。。) 绑定GRID 。
LMemStream := TServerMethodsClient(ServerConnection).StreamGet 代理类通过连接组件,获取服务端 数据流 TStream;
FDSchemaAdapter.LoadFromStream(LMemStream, TFDStorageFormat.sfBinary) 从流中加载 数据集。
3、(考虑!)应用 Rest Datasnap 服务端 ,Http通信, TFDJsonDataSets 与 TFDJsonDelta 格式交换数据
示例 第9章3节 (9.3) 使用TFDJsonDataSets 功能 参考《Delphi 10.1 Berlin DataSnap 开发手册》
4、(推荐)使用 Rest Client 连接 Restful 服务,不限定于(Delphi 产生的),关注 :TRESTResponseDataSetAdapter 的应用。
《Delphi 10.1 Berlin FireDAC 数据库开发手册》 P109 第 3-1-2 章节 介绍了应用 ,使用 TFDMemTable 处理 Rest 获得的数据。
使用 TRESTResponseDataSetAdapter 将 TRESTResponse数据提供给 TFDMemTable ,包含了 元数据信息。
官方示例 : http://docwiki.embarcadero.com/RADStudio/Tokyo/en/REST_Client_Library
Delphi 使用 Datasnap 的几种三层应用技术总结的更多相关文章
- 让Delphi的DataSnap发挥最大效率
让Delphi的DataSnap发挥最大效率 让Delphi的DataSnap发挥最大效率 一个DataSnap的应用程序由两个层组成: DataSnap服务器,它有一个带有一个或者更多DataSet ...
- java android 访问DELPHI 的DATASNAP
最新版的DELPHI开发DATASNAP非常简单便捷,DataSnap的REST风格和对JSON的支持,使之成为服务器端开发的神器. 一.DATASNAP服务器中的方法: TServerMethods ...
- [转]Delphi调用cmd的两种方法
delphi调用cmd的两种方法vars:string;begins:='cmd.exe /c '+edit1.Text+' >c:\1.txt';winexec(pchar(s),sw_hid ...
- Delphi体系内部的4种消息传递办法(Send,Post,Perform,Dispatch)
一.什么是消息? 消息是windows对应用程序发送的有关‘发生了某种事件’的通知.例如点击鼠标,调整窗口大小或键盘上按下一个键,都会引起windows发送一条消息到应用程序中去,去通知应用程序发生了 ...
- delphi杀进程的两种方式
delphi杀进程的两种方式 uint unit Tlhelp32; 第一种:比较简单,根据标题,找到窗口,再找到进程,杀死进程 procedure KillProgram(WindowTitle : ...
- Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的
bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...
- Delphi 和 C++Builder 2014年及以后技术路线图
RAD Studio, Delphi 和 C++Builder 2014年及以后技术路线图 By: Embarcadero News 内容源自Embarcadero新闻组,本人水平有限,欢迎各位高人修 ...
- Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...
- 思科ACI是一种什么样的技术?
术语: SDN:Software Defined Network,软件定义网络 ACI:Application Centric Infrastracture,以应用为中心的基础网络架构 Fabric: ...
随机推荐
- 面向对象【day08】:异常处理(六)
本节内容 1.概述 2.异常梳理 3.异常梳理流程图 4.异常大全 5.自定义异常 一.概述 异常处理是当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的 ...
- JAVA核心技术I---JAVA基础知识(不可变对象和字符串)
一:不可变对象 不可变对象(Immutable Object) –一旦创建,这个对象(状态/值)不能被更改了–其内在的成员变量的值就不能修改了. –典型的不可变对象 • 八个基本型别的包装类的对象 • ...
- synchronized和volatile的区别
但是volatile不适合做计数器使用,即使他具有可见性,但是它不具有原子性.不能保证数据的一致性. 但是volatile适合哪种场景呢? 比较适合做一些标示.比如说两个线程,线程B必须得等线程A执行 ...
- 4.工厂方法模式(Factory Method)
耦合关系: 动机(Motivation): 在软件系统中,由于需求的变化,"这个对象的具体实现"经常面临着剧烈的变化,但它却有比较稳定的接口. 如何应对这种 ...
- 使用rvm安装与切换Ruby
列出已知的 Ruby 版本 rvm list known安装一个 Ruby 版本 rvm install 2.3.1 --disable-binary这里安装了最新的 2.2.0, rvm list ...
- Maccms8.x 命令执行漏洞分析
下载链接https://share.weiyun.com/23802397ed25681ad45c112bf34cc6db 首先打开Index.php $m = be('get','m'); m参数获 ...
- jQuery使用(六):DOM操作之元素包裹、克隆DOM与data的综合应用
包裹 wrap() wrapInner() wrapAll() unwrap() clone() 数据缓存机制 data 文档处理(包裹) 1.1.wrap()--将所匹配的元素用其他元素结构化标签包 ...
- Install Ubuntu Server
进入引导程序以后, 选择Install Ubuntu Server, 安装主菜单如下: 依次配置: 接着 https://www.youtube.com/watch?v=gqLaT01yei0
- sql -leetcode 178. Rank Scores
Score 很好得到: select Score from Scores order by Score desc; 要得到rank, 可以通过比较比当前Score 大的Score 的个数得到: sel ...
- Ubuntu中创建、删除、更改、移动文件的命令
1.创建一个目录 $ sudo mkdir <目录名> 2.删除一个非空目录下的一切 $ sudo rm -rf <目录名> 3.将文件file1,更改文件名为file ...