zoukankan      html  css  js  c++  java
  • 一个例子说明如何在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;


  • 相关阅读:
    css 讲浮动,haslayout,BFC的文章
    css 给inline和inline-block元素设置margin和padding
    css inline元素和inline-block元素之间缝隙产生原因和解决办法
    js 匿名函数立即执行问题
    css 解决图片下小空隙问题
    css BFC布局及用处
    css 单行/多行文字垂直居中问题
    js柯里化
    js 回调函数理解与应用
    js 四种调用模式和this的关系总结
  • 原文地址:https://www.cnblogs.com/xieyunc/p/9126542.html
Copyright © 2011-2022 走看看