Потоковая передача TClientDataSet с использованием Datasnap в Delphi XE6

Я пытаюсь передать 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;

Я также пробовал потоковую передачу в виде XML вместо двоичного.

  CDS.SaveToStream(result, dfXML);

получить ту же ошибку

«Отсутствует поставщик данных или пакет данных»

ОТВЕЧАТЬ:

CDS.SaveToStream(result);
Result.Position := 0; //need this in server method "getCDSData"

person John    schedule 26.05.2016    source источник
comment
Какова цель цикла CDS.First; while not CDS.Eof do CDS.Next, который ничего не делает?   -  person Ken White    schedule 26.05.2016
comment
Если я делаю getCDSData локальным для TForm, ошибка не возникает и данные передаются нормально. Так что я думаю, вам нужно посмотреть на свой сервер. Вы пробовали запустить сервер под отладчиком, пока он выполняет getCDSData?   -  person MartynA    schedule 26.05.2016
comment
Вы видели этот пример, который возвращает TDataSet напрямую методом сервера? sourceforge.net/p/radstudiodemos /code/HEAD/дерево/ветки/   -  person Uwe Raabe    schedule 26.05.2016
comment
Привет, MartynA, да, я тоже проверял это, и вы правы, потоковая передача работает нормально, когда весь код помещается в клиентский модуль.   -  person John    schedule 26.05.2016
comment
аааа, оказывается, в методе getCDSData на стороне сервера мне нужен Result.Position := 0 после Save to Stream. Я обновлю код выше   -  person John    schedule 26.05.2016


Ответы (1)


person    schedule
comment
Я столкнулся с ошибкой «Отсутствует поставщик данных» или «Пакет данных» в коде на стороне клиента. Я попробовал решение, приведенное выше, но оно не работает. любые комментарии по этому поводу будут действительно оценены. - person mano; 02.11.2017