2014年6月6日星期五

在客戶端用FDConnection替代SQLConnection(二)

东摸西摸,算是搞出来了怎么使用,同时埋怨EMBT的文档质量。
在客户端用FDConnection替代SQLConnection后,用TFDStoredProc可以来访问服务器上返回DataSet的方法
服务端仍然是老代码
function TSmSample.GetTblImage: TDataSet;
var
  Conn: TFDConnection;
  Query: TFDQuery;
begin
  Conn := dmConn.AcquireConnection;
  Query := TFDQuery.Create(nil);

  try
    Query.Connection := Conn;
    Query.SQL.Text := 'SELECT * FROM tbl_image';
    Query.Active := True;
    Query.FetchAll;
    Result := TFDMemTable.Create(nil);
    TFDMemTable(Result).Data := Query.Data;  //will not trigger fetchall auto
  finally
    if Assigned(Query) then
      FreeAndNil(Query);
    dmConn.ReleaseConnection(Conn);
  end;
end;

procedure TSmSample2.Plus10(var I: Integer);
begin
   log.TrackMethod('TSmSample2.Plus10');
   I := I + 10;
end;
客户端,用FDConnection来搞就变成
procedure TForm1.Button5Click(Sender: TObject);
begin
  FDStoredProc1.Close;
  FDStoredProc1.Unprepare;
  FDStoredProc1.StoredProcName := 'TSmSample.GetTblImage';
  FDStoredProc1.Open;  //ParamByName('ReturnValue') is ptResult, a DataSet
  with FDStoredProc1 do
  while not Eof do
  begin
    log.Debug('record:%s', [FieldByName('PId').AsString]);
    Next;
  end;
  FDStoredProc1.Close;  

  FDStoredProc1.Close;
  FDStoredProc1.Unprepare;
  FDStoredProc1.StoredProcName := 'TSmSample2.Plus10';
  FDStoredProc1.Prepare;
  FDStoredProc1.ParamByName('I').Value := 20;
  FDStoredProc1.ExecProc;
  ShowMessage(inttostr(FDStoredProc1.ParamByName('I').AsInteger));  //30
  FDStoredProc1.Close;
end;
这个FDStoredProc有些像SQLConnection的SqlServerMethod,放到Form里后,点StoredProcName就访问服务器要meta信息建立下拉框了。

另外还发现的事情是,由于没走DBX,不设置DataSnapCompatibility=true,客户端也能正常显示数据,不会出现SBcdOverflow异常,FireDac的FireDAC.Comp.DataSet单元的TFDDataSet.AddFieldDesc函数里面,没有像TCustomSQLDataSet.AddFieldDesc去调整精度。另外虽然说没走dbExpress,但目前的DataSnap仍然大量用了dbx的很多unit。

没有评论:

发表评论