Delphi、TBlobField和UTF8
以下是我的架构: 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的响应是一个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”(顶部下划
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;