Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi、TBlobField和UTF8_Delphi_Utf 8_Blob_Clob - Fatal编程技术网

Delphi、TBlobField和UTF8

Delphi、TBlobField和UTF8,delphi,utf-8,blob,clob,Delphi,Utf 8,Blob,Clob,以下是我的架构: Datasnap客户端Datasnap服务器Oracle 11 XE 我正在客户端使用带有TDSProviderConnection的远程提供程序访问我的数据集 基本上,我使用一个TIdHTTP组件来查询网站并将结果存储在Oracle CLOB列中 将结果保存到文件时,将正确显示文本、重音符号和其他外来字符。 使用sqldeveloper插入clob的相同文本也会正确显示 但当我通过datasnap架构执行此操作时,会显示错误的字符(如黑钻石或“upperscore”(顶部下划

以下是我的架构:

Datasnap客户端Datasnap服务器Oracle 11 XE

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

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

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

但当我通过datasnap架构执行此操作时,会显示错误的字符(如黑钻石或“upperscore”(顶部下划线)

我的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进行了测试,该组件似乎是我问题的一部分。让我解释一下:

我从一个扩展字符集中随机抽取一个字符串,如下所示:“ÐÒÙÜßąĀÆ”

使用my ClientDataSet,将分配更改为:

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

FieldByname('MYCLOB')。值:='u208hÒÙÜßąĀÆ'/如果要将一些数据放入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;
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;
   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;