多层数据库应用基于Delphi DataSnap方法调用的实现(一)返回数据集
从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方法调用的实现(一)返回数据集的更多相关文章
- JQuery的Ajax使用Get,Post方法调用C#WebService并返回数据
本文将介绍jQuery调用基于.NET Framework 3.5的WebService返回JSON数据,另外还要介绍一下用jQuery调用WebService的参数设置及设置不当所出现的问题,还有出 ...
- RMI远端方法调用
一.RMI介绍 RMI(Remote Method Invocation),RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信.必须在jdk1.1以上,RMI用到的类:java. ...
- Java RMI远程方法调用
RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...
- Java和Ibatis调用存储过程并取得返回值详解
Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...
- java servlet调用带有多个返回结果集的存储过程
一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...
- 基于Delphi的三层数据库系统的实现方法
基于Delphi的三层数据库系统的实现方法 1 引言 当前的数据库应用系统中,按其结构划分为两类,一类是两层结构的数据库应系统,另一类是多层结构的数据库应用系统. 两层结构的数据库应用系统包括客 ...
- delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)
string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...
- [原创]基于SpringAOP开发的方法调用链分析框架
新人熟悉项目必备工具!基于SpringAOP开发的一款方法调用链分析插件,简单到只需要一个注解,异步非阻塞,完美嵌入Spring Cloud.Dubbo项目!再也不用担心搞不懂项目! 很多新人进入一家 ...
- Delphi按名字调用方法高级解决方案
转帖于https://lfzhs.iteye.com/blog/980200 按名字调用方法似乎一直以来都是大家比较关注的技术,在论坛上有一个经典的答复: type TProcedure = proc ...
随机推荐
- IOCP和WSA异步协同客户端版
有些小伙伴看了之前发的WIN平台下IOCP和WSA异步协同处理SOCKET后有些疑惑,所以就画了个简易流程图+架构图发上来给小伙伴参考 简单说,WSA异步控制CONNECT,IOCP控制WSASend ...
- SparkSQL(源码阅读三)
额,没忍住,想完全了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,所以今天再多看点好了~ 曾几何时,有一个叫做shark的东西,它改了hive的源码...突然有一天,spark Sql突然出现 ...
- mySql事务_ _Java中怎样实现批量删除操作(Java对数据库进行事务处理)?
本文是记录Java中实现批量删除操作(Java对数据库进行事务处理),在开始之前先来看下面这样的一个页面图: 上面这张图片显示的是从数据库中查询出的出租信息,信息中进行了分页处理,然后每行的前面提 ...
- [ActionScript 3.0] 将组件 SWC 文件导入 Flash
在向其它开发人员分发组件时,您可以包含以下说明,以便他们能够立即安装和使用组件. 导入 SWC 文件: 将 SWC 文件复制到 Configuration/Components 目录中. 重新启动 ...
- VMware Workstation 11, 客户机Ubuntu14.04.1 LTS 64bit,宿主机Windows 8.1 64bit,剪贴板共享(copy and paste)失效问题
Ubuntu14.04是从12.04升级上来的,因为GUI性能的原因相继装了Xubunbu和Lubuntu的包(Lubuntu的桌面果然轻量级,但是请神容易送神难,卸载Xubuntu很麻烦,就先放下了 ...
- Asprise-OCR的使用
Asprise-OCR下载地址: http://asprise.com/product/ocr/download.php?lang=csharp 其中需要使用的3个dll是AspriseOCR.dll ...
- Jmeter分布式测试
随着并发量的增大,一台机器就不能满足需求了,所以我们采用分布式(Master-Slaver)的方案去执行高并发的测试 注意事项: Master机器一般我们不执测试,所以可以拿一台配置差些的机器,主要用 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
- sqlldr
1.字符集 sqlldr可以指定读取的文件的字符集,如果数据库为gbk,读取的文件为utf-8,这个时候就需要指定字符集 load data CHARACTERSET 'UTF8' 2.sqlldr导 ...
- C#小实例之---C#判断网络
方式一: [DllImport("wininet")] private extern static bool InternetGetConnectedState(out int c ...