这是我的架构:
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
属性设置为ftOraClob
或ftBlob
,但是没有运气。最后,使用
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/