2

ここに私のアーキテクチャがあります:

Datasnap クライアント <=> Datasnap サーバー <=> Oracle 11 XE

クライアント側から TDSProviderConnection を持つリモート プロバイダーを使用して、データセットにアクセスしています。

基本的に、TIdHTTP コンポーネントを使用して Web サイトにクエリを実行し、結果を Oracle CLOB 列に格納しています。

結果をファイルに保存するとき、テキスト、アクセント付きの文字、およびその他のエキゾチックな文字が正しく表示されます。sqldeveloper を使用して clob に挿入された同じテキストも正しく表示されます。

しかし、datasnap アーキテクチャを介してこれを行っていると、間違った文字が表示されます (黒いひし形や「アッパースコア」(アンダースコアが上にある) など)。

私の DB 文字セットは AL32UTF8 で、これは Oracle 11 XE のデフォルトの文字セットです。

問題がどこにあるかをよりよく理解するために、クライアントの一部を書き直して、データベースに直接アクセスできるようにしました。そして、datasnap クライアントとサーバー間の通信に問題はないと言えます。

今私のアーキテクチャは次のとおりです。

クライアント <=> データベース

そして、次の方法で Oracle XE にアクセスします。

TClientDataSet <=> TDataSetProvider <=> TSQLDataSet <=> TSQLConnection

である TIdHTTP からの応答は、次TMemoryStreamのように TClientDataset に格納されます。

    With ClientDataSet do
    begin
      Edit;
      (Fieldbyname('MYCLOBFIELD') as TBlobField).LoadFromStream(MS);
      ApplyUpdates(-1);
    end;

編集:5月21日

私は TBlobField をテストしましたが、このコンポーネントは私の問題の一部のようです。説明させてください:

次のような拡張文字セットの文字を含むランダムな文字列を取得しました: 'ÐÒÙÜßąĀûÆ'

そして私のClientDataSetで、割り当てをこれに変更しました:

    FieldByname('MYCLOB').value := 'ÐÒÙÜßąĀûÆ'; // <-- Inserted correctly into Oracle.

この文字列をファイル 'test.txt' に入れて、コンテンツを含むポップアップを表示しようとしても機能しません:

    var
      MyBlobField: TBlobField;
    begin
      MyBlobField.LoadFromFile('test.txt');
      ShowMessage(MyBlobField.AsString); // <-- does not display correctly

しかし、TMemo を使用してコンテンツを表示するのは魅力的です。

    var
      MyMemo: TMemo;
    begin
      MyMemo.Lines.LoadFromFile('test.txt'); // <-- Works perfectly !!

TBlobField.BlobTypeプロパティをftOraCloborに設定しようとしましたがftBlob、うまくいきませんでした。

最後に、TStringList(TMemo.Lines実際には) を使用して文字列を Oracle にロードすると、うまくいきます。

何かが間違っているか、正しく使用していないと思いますTBlobField.LoadFromFile/LoadFromStream

TStringListLoadFromFile/LoadFromStreamは、機能する TStrings からメソッドを継承します。

どんな助けでも大歓迎です。よろしく。

4

1 に答える 1

1

TBlobField にデータを入れたい場合は、次を試してください。

procedure SetParamBlob(Param : TParam; sData : String);
var  
 Str       : TStringStream;
begin
 Str := TStringStream.Create(sData);
 try
   Param.LoadFromStream(Str, ftBlob);
 finally
   Str.Free;
 end;
end;

またはこれ:

procedure SetParamBlob(Param : TParam; sData : String);
var List   : TStringList;
   MemStream : TMemoryStream;
begin
  Param.Clear;
  Param.DataType := ftBlob;
  List   := TStringList.Create;
  MemStream := TMemoryStream.Create;
  try
    List.Text := sData;
    List.SaveToStream(MemStream);
    MemStream.Seek(0, soFromBeginning);
    Param.LoadFromStream(MemStream, ftBlob);
   finally
    FreeAndNil(List);
    FreeAndNil(MemStream);
   end;
end;

... ... SetParamBlob(q.ParamByName('FIELD'), MyMemo.Text); ...

これにより、ファイルからデータをロードできます。

   function LoadData(sFileSrc : String) : String;
   var F : TFileStream;
   begin
     F := TFileStream.Create(sFileSrc, fmOpenRead + fmShareDenyNone);
     try
       SetLength(Result, f.Size);
       f.Read(Result[1],f.Size);
      finally
       F.Free;
      end;
    end;
于 2013-02-07T21:07:44.340 に答える