ここに私のアーキテクチャがあります:
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
プロパティをftOraClob
orに設定しようとしましたがftBlob
、うまくいきませんでした。
最後に、TStringList
(TMemo.Lines
実際には) を使用して文字列を Oracle にロードすると、うまくいきます。
何かが間違っているか、正しく使用していないと思いますTBlobField.LoadFromFile/LoadFromStream
。
TStringListLoadFromFile/LoadFromStream
は、機能する TStrings からメソッドを継承します。
どんな助けでも大歓迎です。よろしく。