从Delphi 2009开始,DataSnap技术发生了很大的变化,并在Delphi 2010和Delphi XE的后续版本中得到了持续的改进。Delphi 2009之前的DataSnap,虽然也实现了对中间层的方法调用,但那是基于COM技术的,实现起来比较麻烦,而且最关键的,是不能直接返回数据集(TDataSet)。如今,基于JSON的DataSnap,已经脱离了COM的束缚,可以很方便地直接返回数据集。我们在开发多层的数据库应用时,就可以采用全新的方式来进行,即客户端的所有数据查询和更新,可以被分割成对中间层多个方法的调用来完成。这种方式带来的最直接效果,就是客户端在完成一个完整的业务操作过程中,客户端到中间层、中间层到数据库的两个连接都不需要被保持,中间层如果再配合对象池、连接池技术,就可以服务于更多数量的客户端,服务器的各种资源也能够得到最大化的利用。

如上图所示,客户端的3个连续活动,完成一个完整的业务操作。整个业务操作,通过两次对中间层的方法调用来完成。两次方法调用中,DataSnap中间层提供方法调用服务的业务类实例可能是不一样的,这取决于类工厂(TDSServerClass)的LifeCycle属性。

下面简单演示一个例子。
1、中间层的实现:
...
{$METHODINFO ON}
  TServerMethods1 = class(TDataModule)
    SQLConnection1: TSQLConnection;
    SQLDataSet1: TSQLDataSet;
  private
    { Private declarations }
  public
    { Public declarations }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
    function GetEmployeeFullName(EmployeeId: Integer): string;
    function GetEmployees: TDataSet;
  end;
{$METHODINFO OFF}

...

implementation
...
function TServerMethods1.GetEmployeeFullName(EmployeeId: Integer): string;
begin
  Result := 'Employee not found';

with SQLDataSet1 do
  begin
    CommandText := 'SELECT FIRST_NAME||'' ''||LAST_NAME as FullName ' +
      'FROM Employees WHERE Employee_id = :EmployeeId';
    ParamByName('EmployeeId').AsInteger := EmployeeId;
    Open;
    if not eof then Result := FieldByName('FullName').AsString;
  end;
end;

function TServerMethods1.GetEmployees: TDataSet;
begin
  with SQLDataSet1 do
  begin
    CommandText := 'SELECT * FROM Employees';
    Open;
  end;
  Result := SQLDataSet1;
end;
...

//我们可以发现,不管中间层实际将有多少个不同的数据集要返回,中间层都只需要两个控件,即
//TSQLConnection和TSQLDataSet,通过在TSQLDataSet的CommandText属性中写入不同的SQL语句,就
//可以返回不同的数据集。

2、客户端的相关代码:
...
  TForm2 = class(TForm)
    SQLConnection1: TSQLConnection;
    Employees: TButton;
    SqlServerMethod1: TSqlServerMethod;
    DataSetProvider1: TDataSetProvider;
    ClientDataSet1: TClientDataSet;
    procedure EmployeesClick(Sender: TObject);
  private
  public
  end;
...

//要取得来自于中间层的数据集,使用以上几个控件,它们之间进行关联:
//TClientDataSet-->TDataSetProvider-->TSqlServerMethod-->TSQLConnection-->中间层

implementation
...

//获取数据集
procedure TForm2.EmployeesClick(Sender: TObject);
begin
  with SqlServerMethod1 do
  begin
    ServerMethodName := 'TServerMethods1.GetEmployees';
  end;
  ClientDataSet1.Open;
end;
...

而数据集的更新,也是通过调用中间层的方法来实现,但需要稍微增加点技巧。敬请等待续集。

多层数据库应用基于Delphi DataSnap方法调用的实现(一)返回数据集的更多相关文章

  1. JQuery的Ajax使用Get,Post方法调用C#WebService并返回数据

    本文将介绍jQuery调用基于.NET Framework 3.5的WebService返回JSON数据,另外还要介绍一下用jQuery调用WebService的参数设置及设置不当所出现的问题,还有出 ...

  2. RMI远端方法调用

    一.RMI介绍 RMI(Remote Method Invocation),RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信.必须在jdk1.1以上,RMI用到的类:java. ...

  3. Java RMI远程方法调用

    RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...

  4. Java和Ibatis调用存储过程并取得返回值详解

    Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...

  5. java servlet调用带有多个返回结果集的存储过程

    一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...

  6. 基于Delphi的三层数据库系统的实现方法

    基于Delphi的三层数据库系统的实现方法   1  引言 当前的数据库应用系统中,按其结构划分为两类,一类是两层结构的数据库应系统,另一类是多层结构的数据库应用系统. 两层结构的数据库应用系统包括客 ...

  7. delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)

    string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...

  8. [原创]基于SpringAOP开发的方法调用链分析框架

    新人熟悉项目必备工具!基于SpringAOP开发的一款方法调用链分析插件,简单到只需要一个注解,异步非阻塞,完美嵌入Spring Cloud.Dubbo项目!再也不用担心搞不懂项目! 很多新人进入一家 ...

  9. Delphi按名字调用方法高级解决方案

    转帖于https://lfzhs.iteye.com/blog/980200 按名字调用方法似乎一直以来都是大家比较关注的技术,在论坛上有一个经典的答复: type TProcedure = proc ...

随机推荐

  1. 【DNS】简单聊聊DNS如何工作

    随便聊聊 我们知道,网络上传输的数据包是一层一层的包起来的,典型的是mac地址层,ip层,tcp/udp层,应用层数据 这么几个层,那用户在浏览器中打开www.baidu.com数据包如何传到baid ...

  2. windows使用nginx实现网站负载均衡测试实例

    如果你关注过nginx,必定知道nginx这个软件有什么用的,如果你的网站访问量越来越高,一台服务器已经没有办法承受流量压力,那就增多几台服务器来做负载吧.做网站负载可以买硬件设备来实现,比如F5,不 ...

  3. mysql:忘记root密码

    1:修改/etc/my.cnf 2:重启服务 3:进入mysql 4:修改密码 5:刷新权限 注意:修改完成后,别忘了修改/etc/my.cnf,删除skip-grant-tables,否则重启服务后 ...

  4. 网页制作过程中div定位的三个问题

    这几天要做单位的网站,对于做网站我也不怎么样,于是我便在网上参考了一个比较满意的网站,套一下来把这个工作结束了.在此期间遇到了三个关于div定位问题, 一般网站用div布局时都是从上到下分head . ...

  5. js运动框架之一条乱跑的虫子

    克隆与运动框架的联合应用 效果:点击元素块后,元素块开始随机的向任何方向移动,并附带一堆颜色随机的"尾巴".每个方向运动3秒后改变方向,同时笑脸变哭脸. 如图所示: 朝某个方向运动 ...

  6. c# 变量,对象,静态类型,集合类的线程安全回顾

    1.变量的线程安全性与变量的作用域有关. 2.对象 对象是类型的实例 在创建对象时,会单独有内存区域存储对象的属性和方法.所以,一个类型的多个实例,在执行时,只要没有静态变量的参与,应该都是线程安全的 ...

  7. MODBUS-RTU通讯协议简介

    MODBUS-RTU通讯协议简介   什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...

  8. [转]细说SQL Server中的加密

    简介 加密是指通过使用密钥或密码对数据进行模糊处理的过程.在SQL Server中,加密并不能替代其他的安全设置,比如防止未被授权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在 ...

  9. LEMP安装脚本

    #!/bin/bash#LEMP Serverumount /dev/cdrommount /dev/cdrom /mediaIOS="/etc/yum.repos.d/rhel-debug ...

  10. 部署Service Manager 2012遇到的2个问题

    上周装了个Service Manager 2012学习,以便完善System Center整个解决方案,在部署期间遇到2个问题,花了我不少时间解决.一.安装时提示“执行自定义操作时失败”每当到了安装的 ...