在客户端用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。
没有评论:
发表评论