У меня есть сервер Datasnap Delphi 10.1 Berlin, который не может вернуть пакеты данных (через TStream) больше, чем около 260 000 байт.Не удается получить TStreams больше, чем около 260 000 байт с сервера Datasnap
Я запрограммировал его в соответствии с образцом Delphi, который также показывает эту проблему: \ Object Pascal \ DataSnap \ FireDAC.
Проблему можно увидеть только открыв этот образец, установив заготовку в IndexFieldName компоненты qOrders на ServerMethodsUnit.pas, и изменяя его свойство SQL для:
select * from Orders
union
select * from Orders
Теперь объем данных, отправляемым более 260 000 байт, что, кажется, является тем местом, где вы не можете получить его от клиента. Получение EFDException [FireDAC] [Stan] -710. Недопустимый формат двоичной памяти.
Данные отправляются как поток, который вы получаете из 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 имеет усеченный контент, а последние несколько килобайт - это нули ,
Это, как я сохранить на сервере содержимое, которое будет идти в поток:
FDSchemaAdapter.SaveToFile('C:\Temp\JSON_Server.json', TFDStorageFormat.sfJSON);
Это, как я могу проверить, что я получаю от параметра клиента двоичных объектов:
TFile.WriteAllText('C:\Temp\JSON_Client.json', FDStoredProcGet.Params[0].asBlob);
I может видеть, что Клиент получает данные усеченными.
Вы знаете, как исправить это, или обходной путь для извлечения всего содержимого Stream с сервера Datasnap моему клиенту ?.
Обновление: Я обновил Delphi 10.1 Berlin Update 2, но проблема остается.
спасибо.
Спасибо за этот ответ! Я реализовал свое собственное. Я сделал это, поэтому мне нужно только вызвать одну функцию от клиента, чтобы получить пакеты, доставленные в 260kb. – Henrikki