2016-05-26 2 views
2

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

Какова цель' CDS.First; а не CDS.Eof do CDS.Next' loop, который ничего не выполняет? –

+3

Если я делаю getCDSData локальным для TForm, ошибка не возникает, и данные передаются в порядке. Поэтому я думаю, вам нужно посмотреть на свой сервер. Вы пытались запустить сервер под отладчиком, когда он выполняет getCDSData? – MartynA

+0

Вы изучили этот пример, который возвращает TDataSet напрямую с помощью метода сервера? https://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE6/Object%20Pascal/DataSnap/Basic/ –

ответ

1
CDS.SaveToStream(result); 
Result.Position := 0; 
+0

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