2

这是我的架构:

Datasnap 客户端 <=> Datasnap 服务器 <=> Oracle 11 XE

我在客户端使用带有 TDSProviderConnection 的远程提供程序来访问我的数据集。

基本上,我使用 TIdHTTP 组件来查询网站并将结果存储在 Oracle CLOB 列中。

将结果保存到文件时,文本、重音符号和其他外来字符会正确显示。使用 sqldeveloper 插入到 clob 中的相同文本也可以正确显示。

但是当我通过数据快照架构执行此操作时,会出现错误的字符(如黑色菱形或“大写”(下划线在顶部)

我的 DB 字符集是 AL32UTF8,它是 Oracle 11 XE 上的默认字符集。

为了更好地了解问题出在哪里,我重写了部分客户端以直接访问我的数据库。我可以说问题不在于 datasnap 客户端和服务器之间的通信。

现在我的架构是:

客户端 <=> 数据库

我通过以下方式访问 Oracle XE:

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

来自 TIdHTTP 的响应是 a 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属性设置为ftOraClobftBlob没有运气。

最后,使用TStringListTMemo.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 回答