[转]DataSnap服务器方法返回TClientDataSet的简易实现
来源:互联网 发布:海贼王霸气败笔知乎 编辑:程序博客网 时间:2024/05/16 04:43
[转]DataSnap服务器方法返回TClientDataSet的简易实现
http://m.blog.csdn.net/blog/ddqqyy/6982164
DataSnap服务器方法不能直接返回TClientDataSet类实例,因为DataSnap不支持把TClientDataSet转化JSON对象,但是,DataSnap支持对TDBXReader的解析,我们可以在服务器端,利用TDBXReader的类方法,先把TClientDataSet实例转化为TDBXReader实例,然后把TDBXReader实例通过方法调用传到客户端,最后在客户端再利用TDBXReader的类方法,把接收到的TDBXReader实例转化为最终的TClientDataSet实例,大概思路就是这样。
先看服务器端代码,业务类申明如下:
{$METHODINFO ON}
TdmService = class(TDataModule)
SQLConnection1: TSQLConnection;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
function GetData(sql: string): TDBXReader;
public
{ Public declarations }
function GetActions(PARENTID: string): TDBXReader;
end;
{$METHODINFO OFF}
//其中,私有函数GetData是个通用函数,其作用是返回参数sql语句的执行结果集。公共函数GetActions供用户端调用,返回符合条件的所有Actions记录。具体的实现如下:
function TdmService.GetActions(PARENTID: string): TDBXReader;
var
sql: string;
begin
sql := 'select * from actions where PARENTID=' + PARENTID;
Result := GetData(sql);
end;
function TdmService.GetData(sql: string): TDBXReader;
var
cmd: TDBXCommand;
Reader: TDBXReader;
LDataSet: TClientDataSet;
begin
cmd := SQLConnection1.DBXConnection.CreateCommand;
try
cmd.Text := sql;
Reader := cmd.ExecuteQuery;
LDataSet := TDBXDataSetReader.ToClientDataSet(nil, Reader, True);
Result := TDBXDataSetReader.Create(LDataSet, True);
finally
cmd.Free;
end;
end;
而在客户端,就是调用服务器方法,并转化返回值为TClientDataset:
procedure TForm2.Button1Click(Sender: TObject);
var
CallProxy: TdmServiceClient;
dr: TDBXReader;
begin
if ClientDataSet1.Active then
begin
ClientDataSet1.Close;
ClientDataSet1.FieldDefs.Clear;
ClientDataSet1.Fields.Clear;
ClientDataSet1.IndexDefs.Clear;
end;
CallProxy := TdmServiceClient.Create(SQLConnection1.DBXConnection);
try
dr := CallProxy.GetActions(Edit1.Text);
TDBXDataSetReader.CopyReaderToClientDataSet(dr, ClientDataSet1);
ClientDataSet1.Open;
finally
CallProxy.Free;
end;
end;
其中,TdmServiceClient是自动生成的服务器方法调用的代理类。
http://m.blog.csdn.net/blog/ddqqyy/6982164
DataSnap服务器方法不能直接返回TClientDataSet类实例,因为DataSnap不支持把TClientDataSet转化JSON对象,但是,DataSnap支持对TDBXReader的解析,我们可以在服务器端,利用TDBXReader的类方法,先把TClientDataSet实例转化为TDBXReader实例,然后把TDBXReader实例通过方法调用传到客户端,最后在客户端再利用TDBXReader的类方法,把接收到的TDBXReader实例转化为最终的TClientDataSet实例,大概思路就是这样。
先看服务器端代码,业务类申明如下:
{$METHODINFO ON}
TdmService = class(TDataModule)
SQLConnection1: TSQLConnection;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
function GetData(sql: string): TDBXReader;
public
{ Public declarations }
function GetActions(PARENTID: string): TDBXReader;
end;
{$METHODINFO OFF}
//其中,私有函数GetData是个通用函数,其作用是返回参数sql语句的执行结果集。公共函数GetActions供用户端调用,返回符合条件的所有Actions记录。具体的实现如下:
function TdmService.GetActions(PARENTID: string): TDBXReader;
var
sql: string;
begin
sql := 'select * from actions where PARENTID=' + PARENTID;
Result := GetData(sql);
end;
function TdmService.GetData(sql: string): TDBXReader;
var
cmd: TDBXCommand;
Reader: TDBXReader;
LDataSet: TClientDataSet;
begin
cmd := SQLConnection1.DBXConnection.CreateCommand;
try
cmd.Text := sql;
Reader := cmd.ExecuteQuery;
LDataSet := TDBXDataSetReader.ToClientDataSet(nil, Reader, True);
Result := TDBXDataSetReader.Create(LDataSet, True);
finally
cmd.Free;
end;
end;
而在客户端,就是调用服务器方法,并转化返回值为TClientDataset:
procedure TForm2.Button1Click(Sender: TObject);
var
CallProxy: TdmServiceClient;
dr: TDBXReader;
begin
if ClientDataSet1.Active then
begin
ClientDataSet1.Close;
ClientDataSet1.FieldDefs.Clear;
ClientDataSet1.Fields.Clear;
ClientDataSet1.IndexDefs.Clear;
end;
CallProxy := TdmServiceClient.Create(SQLConnection1.DBXConnection);
try
dr := CallProxy.GetActions(Edit1.Text);
TDBXDataSetReader.CopyReaderToClientDataSet(dr, ClientDataSet1);
ClientDataSet1.Open;
finally
CallProxy.Free;
end;
end;
其中,TdmServiceClient是自动生成的服务器方法调用的代理类。
0 0
- [转]DataSnap服务器方法返回TClientDataSet的简易实现
- DataSnap服务器方法返回TClientDataSet的简易实现
- Datasnap 使用JSON 传递数据的简易方法
- 多层数据库应用基于Delphi DataSnap方法调用的实现(一)返回数据集
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (三)用TClientDataSet的“ProviderName”属性连接服务器时,无法找到服务器端的“DatasetProvier”
- TClientDataSet的ApplyUpdates的方法
- [转]多层数据库应用基于Delphi DataSnap方法调用的实现(三)对象池技术
- Delphi DataSnap方法实现BLOB字段的读写
- 简易HTTP服务器的实现
- DataSnap Rest 服务器网络分配器返回格式定义
- 利用DataSnap的回调功能在客户端显示服务器方法的执行进度
- datasnap——动态注册服务类 datasnap——动态注册服务类 在DataSnap的应用程序时,我们首先需要注册的服务器类,以提供访问客户端应用程序的服务器方法。通常的做法是使用DSSer
- 使用Java实现简易的HTTP服务器
- Erlang实现的简易HTTP服务器
- Nio--Selector实现简易的http服务器
- java实现的HTTP简易服务器
- 一个简易TCP服务器的多种实现
- Nio--Selector实现简易的http服务器
- 积极心理学名人名言
- DataSnap客户端共享服务器端的数据库连接
- Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
- 我们的未来在哪里
- 使用System.arraycopy()实现数组之间的复制
- [转]DataSnap服务器方法返回TClientDataSet的简易实现
- 计算机经典书籍电子书合集(适合计算机学生学习以及程序员笔试、面试)
- 中国版XBee模块,同样支持arduino,完全兼容XBee
- POJ 3667 Hotel 线段树(区间合并)
- Ibatis学习笔记
- JAVA二维数组拷贝
- 中越勘界结束,法卡山老山归了谁?
- 多层数据库应用基于Delphi DataSnap方法调用的实现(四)BLOB字段的读写
- 奇偶数分离