Я пытаюсь передать TClientDataSet, используя Datasnap в Delphi XE6. Тем не менее, я продолжаю получать ошибку «Пропущенный поставщик данных или пакет данных» в кодах на стороне клиента.Streaming TClientDataSet с использованием Datasnap в Delphi XE6
// Клиент
procedure TForm2.Button1Click(Sender: TObject);
var
CDS: TClientDataSet;
S: TStream;
begin
CDS := TClientDataSet.Create(nil);
try
S:= ClientModule1.ServerMethods1Client.getCDSData;
S.Seek(0,soFromBeginning);
S.Position:= 0;
CDS.LoadFromStream(S);
CDS.Open; // Missing Data Provider or Data Packet
finally
CDS.Free;
end;
end;
// Сервер
function TServerMethods1.getCDSData: TStream;
var
Writer: TBinaryWriter;
CDS: TClientDataSet;
I: Integer;
begin
result := TMemoryStream.Create;
CDS := TClientDataSet.Create(nil);
with CDS.FieldDefs do
begin
Clear;
Add('First', ftString, 20);
Add('Last', ftString, 25);
end;
CDS.CreateDataSet;
CDS.Open;
CDS.AppendRecord(['John', 'Smith']);
CDS.AppendRecord(['Jane', 'Doe']);
try
CDS.SaveToStream(result);
finally
CDS.Free;
end;
end;
Я также попытался Streaming как XML вместо Binary
CDS.SaveToStream(result, dfXML);
получить ту же ошибку
" Отсутствующий поставщик данных или пакетных данных»
ОТВЕТ:
CDS.SaveToStream(result);
Result.Position := 0; //need this in server method "getCDSData"
Какова цель' CDS.First; а не CDS.Eof do CDS.Next' loop, который ничего не выполняет? –
Если я делаю getCDSData локальным для TForm, ошибка не возникает, и данные передаются в порядке. Поэтому я думаю, вам нужно посмотреть на свой сервер. Вы пытались запустить сервер под отладчиком, когда он выполняет getCDSData? – MartynA
Вы изучили этот пример, который возвращает TDataSet напрямую с помощью метода сервера? https://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE6/Object%20Pascal/DataSnap/Basic/ –