这是我的架构:

Datasnap客户端 Datasnap服务器 Oracle 11 XE

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

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

将结果保存到文件时,将正确显示文本,带重音符号和其他奇特字符。
使用sqldeveloper插入Clob的相同文本也可以正确显示。

但是,当我通过数据快照架构进行此操作时,出现了错误的字符(例如黑色菱形或“ upperscore”(上划线))

我的数据库字符集为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属性设置为ftOraClobftBlob,但是没有运气。

最后,使用TStringList(实际上是什么TMemo.Lines)将字符串加载到Oracle中就可以了。

我想TBlobField.LoadFromFile/LoadFromStream出了点问题,或者我没有正确使用它。

TStringList从TStrings继承其LoadFromFile/LoadFromStream方法,该方法有效。

任何帮助将不胜感激。
问候。

最佳答案

如果要将某些数据放入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;

关于delphi - Delphi,TBlobField和UTF8,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10643591/

10-12 03:00