Delphi 在DataSnap中使用FireDAC


本文整理自网络,侵删。

 
一、FireDAC调用DataSnap远程方法查询数据示例
1、服务端使用FDQUERY查询数据并返回TDATASET:

function TServerMethods1.GetData(var sqlstr: string): TDataSet;
var
  qry:TFDQurey;
begin
  qry := TFDQuery.Create(nil);
  try
    qry.Connection := TServerContainer1.FDConnection1;
    qry.Open(sql);
    Result := TFDMemTable.Create(nil);
    TFDMemTable(Result).Data := qry.Data;
  finally
    qry.Free;
  end;
end;
2、客户端既可以用FDConnection连接DataSnap中间层,也可以用SQLConnection连接DataSnap中间层,如果用FDConnection连接DataSnap,则可以用FDStoredProc访问远程方法,如:
procedure TForm1.Button1Click(Sender: TObject);
begin
  FDConnection1.Connected := true;
  FDStoredProc1.Close;
  FDStoredProc1.Unprepare;
  FDStoredProc1.StoredProcName := 'TServerMethods1.GetData';
  FDStoredProc1.Prepare;
  FDStoredProc1.ParamByName('sqlstr').Value := 'select * from bas_goods';
  FDStoredProc1.Open;
  FDMemTable1.Close;
  FDMemTable1.Data := FDStoredProc1.Data;
  FDStoredProc1.Close;
end;
二、使用FireDAC如何在客户端提交Delta数据
    你可以在客户端序列FireDAC数据集的DELTA , 将序列后的Stream发送给中间件,中间件的TFDQuery或TFDMemTable调用LoadFromStream()方法加载流,然后调用ApplyUpdates()将数据保存进数据库中。

    怎样转换TFDQuery或TFDMemTable的Delta为Stream呢?
    首先,你需要设置FDQuery或TFDMemTable的ResourceOptions.StoreItems 为 [siDelta]或 [siMeta, siDelta]。
    然后,调用SaveToStream()方法即可。下面是演示用的代码:
var
  Stream:TMemoryStream;
begin
  // qryDataSource have 100 records,modified 1 record,so have 1 Delta record
  Stream := TMemoryStream.Create;
  try
    qryDataSource.ResourceOptions.StoreItems := [siData,siMeta,siDelta];
    Stream := TMemoryStream.Create;
    qryDataSource.SaveToStream(Stream);
    //restore StoreItems
    qryDataSource.ResourceOptions.StoreItems := [siData,siMeta,siDelta];
  
    Stream.Position := 0;
    // remote app,transports stream by http
    qryRemote.Close;
    qryRemote.CachedUpdates := True;
    qryRemote.UpdateOptions.KeyFields := 'ID';
    qryRemote.UpdateOptions.UpdateTableName := '上机记录表';
    qryRemote.SQL.Text := 'select * from 上机记录表 where 1=0';
  
    //qryRemote.ResourceOptions.StoreItems := [siMeta,siDelta,siData];
    //It load 100 reocrds,not only 1 delta record
    qryRemote.LoadFromStream(Stream);
    // commit and refresh
    qryRemote.ApplyUpdates();
    qryDataSource.CommitUpdates;
    qryDataSource.Refresh;
  finally
    Stream.Free;
  end;
end;

相关阅读 >>

Delphi真正实现延时暂停功能

Delphi dbgrideh 的分组统计 datagrouping

Delphi 磁盘类型 getdrivetype

Delphi xe 网上获取北京时间android app 启动黑屏优化补丁

Delphi 获取鼠标当前位置的相对坐标

Delphi webbrowser中模拟连接点击(非鼠标模拟)

Delphi android 关闭应用程序对话框询问

Delphi firedac连接mysql的时候报错

Delphi来实现全屏截图

Delphi ddk与wdk

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...