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