2017-11-02 3 views
0

私はクライアントにサーバーアプリケーションを持っているdatasnapテクノロジを使用しています。 サーバはデータベースからデータを取得し、ストリームに入れ、次にクライアント側で取得します。 クライアントサイドのコードに「データプロバイダまたはデータパケットが見つかりません」というエラーが表示され続けます。「データプロバイダまたはデータパケットが見つかりません」エラー - クライアントデータセット内のストリームとしてデータを交換

サーバー側のコード:

function GetFiles(ClientID: integer): TStream; 
var 
    CDS: TClientDataSet; 
begin 
    try 
    Result := TMemoryStream.Create; 
    CDS := TClientDataSet.Create(nil); 
    with adsFiles do // ads is adodataset and dspFiles is the dataset provider which has its dataset property set to adsFiles 
    begin 
    Close; 
    Parameters.ParamByName('ClientID').Value := ClientID; 
    Open; 
    CDS.Data := dspFiles.Data; 
    CDS.Open; 
    CDS.SaveToStream(Result); 
    Result.Position := 0; 
    end; 
    finally 
    CDS.Free; 
    end; 

クライアント側コード:

procedure ExportData; 
var 
    StreamData: TStream; 
begin 
    StreamData := SvrMethodClass.GetFiles(AClientID); 
    StreamData.Seek(0,soFromBeginning); 
    StreamData.Position:= 0; 
    cdsClientFiles.LoadFromStream(StreamData); // getting the error message "Missing Data Provider or Data Packet" 
    cdsClientFiles.Open; 
end; 

クライアント側は、私は、ClientDataSetのコンポーネントをドロップし、このデータセットの問題にデータをロードしようとしています私がどこに間違っているかを指摘する助けが集められれば、本当に感謝しています。おかげ

同様の質問:Streaming TClientDataSet using Datasnap in Delphi XE6 ソリューションをチェックしますが、それは

+0

あなたがリンクしたqのコメントを読んでから、デバッグをしてください。問題を再現できない読者があなたを助けることができないので、MCVEを提供してください。一方、-1。 – MartynA

+0

Btwでは、 'ads'が行を返すかどうかチェックしていません。それは意図的なのでしょうか? – MartynA

+0

@MartynA私はサーバー側をチェックしました。私はそれが行を返すのを見ることができ、私はさらにxmlにデータを保存しようとしました、そしてそれは204MBです。 – mano

答えて

1

をうまくいかなかった私は、DataSnapサーバーからストリームとしてデータを返すの問題を調査し、多くの時間を費やした - 例えば見ますCan't retrieve TStreams bigger than around 260.000 bytes from a Datasnap Serverであるが、ストリームデータの満足できる解決策を思い付くことができなかった。

しかし、実験では、文字列データ(数百メガバイトまでの文字列をテストしました)では同様の問題は発生しないことが明らかになりました。ですから、DatasnapサーバーからBase64でエンコードされた文字列としてバイナリ/ blobデータを送信することをお勧めします。

もちろん、ADOまたはCDSデータの文字列表現が適切な場合は、サーバーメソッドでadsFile.SaveToFile(..., pfXML)またはCDS.SaveToFile(... dfXML)を実行してから、結果のファイルを文字列として返すことができます。

+0

私はこの答えを受け入れますが、これはメモリの問題をサーバー側で解決します。私はサーバー側からデータセットレベルでプライマリキーの参照を1つのデータセットに保存し、後で各繰り返しで別のデータセットのブロブデータを含む単一のファイルをエクスポートすることができます。 助けてくれてありがとう:) – mano

関連する問題