我有一个Delphi 10.1 Berlin Datasnap Server,它不能返回大于260.000字节的数据包(通过TStream).
我在Delphi 的\ Object Pascal\DataSnap\FireDAC示例之后编写了它,它也显示了这个问题.
只需打开该示例,在ServerMethodsUnit.pas上将qOrders组件的IndexFieldName设置为空白,并将其SQL属性更改为:
select * from Orders union select * from Orders
现在要发送的数据量超过260.000字节,这似乎是您无法从客户端检索它的点.获得EFDException [FireDAC] [Stan] -710.二进制存储格式无效.
数据作为Stream从服务器上的FDSchemaAdapter获取,然后加载到客户端上的另一个FDSchemaAdpater.客户端和服务器之间的连接也是FireDAC.
这是服务器返回该流的方式:
function TServerMethods.StreamGet: TStream; begin Result := TMemoryStream.Create; try qCustomers.Close; qCustomers.Open; qOrders.Close; qOrders.Open; FDSchemaAdapter.SaveToStream(Result, TFDStorageFormat.sfBinary); Result.Position := 0; except raise; end; end;
这就是客户端检索它的方式:
procedure TClientForm.GetTables; var LStringStream: TStringStream; begin FDStoredProcGet.ExecProc; LStringStream := TStringStream.Create(FDStoredProcGet.Params[0].asBlob); try if LStringStream <> nil then begin LStringStream.Position := 0; DataModuleFDClient.FDSchemaAdapter.LoadFromStream(LStringStream, TFDStorageFormat.sfBinary); end; finally LStringStream.Free; end; end;
客户端无法获取Blob参数的所有数据.我在服务器上保存Stream的内容,以及在客户端上到达Blob参数的内容,并且它们具有相同的大小,但Blob参数的内容的内容被截断,最后几个Kbytes为零.
这就是我在服务器上保存将转到Stream的内容的方法:
FDSchemaAdapter.SaveToFile('C:\Temp\JSON_Server.json', TFDStorageFormat.sfJSON);
这是我检查客户端blob参数的方法:
TFile.WriteAllText('C:\Temp\JSON_Client.json', FDStoredProcGet.Params[0].asBlob);
我可以看到客户端获取截断的数据.
您知道如何修复它,或者从Datasnap Server检索所有Stream内容到我的客户端的解决方法吗?
更新:我已更新到Delphi 10.1 Berlin Update 2,但问题仍然存在.
谢谢.