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 的几种三层应用技术总结的更多相关文章

  1. 让Delphi的DataSnap发挥最大效率

    让Delphi的DataSnap发挥最大效率 让Delphi的DataSnap发挥最大效率 一个DataSnap的应用程序由两个层组成: DataSnap服务器,它有一个带有一个或者更多DataSet ...

  2. java android 访问DELPHI 的DATASNAP

    最新版的DELPHI开发DATASNAP非常简单便捷,DataSnap的REST风格和对JSON的支持,使之成为服务器端开发的神器. 一.DATASNAP服务器中的方法: TServerMethods ...

  3. [转]Delphi调用cmd的两种方法

    delphi调用cmd的两种方法vars:string;begins:='cmd.exe /c '+edit1.Text+' >c:\1.txt';winexec(pchar(s),sw_hid ...

  4. Delphi体系内部的4种消息传递办法(Send,Post,Perform,Dispatch)

    一.什么是消息? 消息是windows对应用程序发送的有关‘发生了某种事件’的通知.例如点击鼠标,调整窗口大小或键盘上按下一个键,都会引起windows发送一条消息到应用程序中去,去通知应用程序发生了 ...

  5. delphi杀进程的两种方式

    delphi杀进程的两种方式 uint unit Tlhelp32; 第一种:比较简单,根据标题,找到窗口,再找到进程,杀死进程 procedure KillProgram(WindowTitle : ...

  6. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的

    bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...

  7. Delphi 和 C++Builder 2014年及以后技术路线图

    RAD Studio, Delphi 和 C++Builder 2014年及以后技术路线图 By: Embarcadero News 内容源自Embarcadero新闻组,本人水平有限,欢迎各位高人修 ...

  8. Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)

    Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...

  9. 思科ACI是一种什么样的技术?

    术语: SDN:Software Defined Network,软件定义网络 ACI:Application Centric Infrastracture,以应用为中心的基础网络架构 Fabric: ...

随机推荐

  1. 简洁架构的思想,基于go实现

    https://manuel.kiessling.net/2012/09/28/applying-the-clean-architecture-to-go-applications/ 从 Clean- ...

  2. Hbase学习01

    1.1  快速介绍 1.1.1 快速入门,单节点Hbase 本小节介绍单节点独立HBase的设置. 独立实例包含所有HBase守护进程 - Master,RegionServers和ZooKeeper ...

  3. Redis之RDB与AOF 笔记

    AOF定义:以日志的形式记录每个操作,将Redis执行过的所有指令全部记录下来(读操作不记录),只许追加文件但不可以修改文件,Redis启动时会读取AOF配置文件重构数据 换句话说,就是Redis重启 ...

  4. Ubuntu 18.04 设置开机启动脚本 rc.local systemd

    ubuntu18.04不再使用initd管理系统,改用systemd. ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.l ...

  5. linux常用命令说明

    1. 基础快捷键使用 ctrl + c:停止进程 ctrl + l:清屏 ctrl + r:搜索历史命令 ctrl + q:退出 2.常用目录或文件夹命令 说明:安装linux时,创建一个itcast ...

  6. apt-get使用命令

    apt-get的卸载命令:remove/purge/autoremove/clean/autoclean apt-get purge / apt-get –purge remove 删除已安装包(不保 ...

  7. 错误 1 “Entities.PlanPrjEntity.PlanPrjs”不可访问,因为它受保护级别限制

    本人第一次是用List做父类,写了一个类PlanPrjs,如下: class PlanPrj { public int ID { get; set; } public string Name { ge ...

  8. weui hd bd ft

    weui样式看到hd ,bd, ft hd 是header的缩写 bd 是body的缩写 ft 是footer的缩写

  9. PHP连接数据库实现多条件查询与分页功能——关于租房页面的完整实例操作

    租房页面如图: 代码如下: <!DOCTYPE html><html>    <head>        <meta charset="UTF-8& ...

  10. [C++]Knights of a Polygonal Table(骑士的多角桌)

    [程序结果:用例未完全通过,本博文仅为暂存代码之目的] /* B. Knights of a Polygonal Table url:http://codeforces.com/problemset/ ...