这是我的架构:
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
属性设置为ftOraClob
或ftBlob
没有运气。
最后,使用TStringList
(TMemo.Lines
实际上是)将我的字符串加载到 Oracle 中就可以了。
我猜要么有问题,TBlobField.LoadFromFile/LoadFromStream
要么我没有正确使用它。
TStringListLoadFromFile/LoadFromStream
从 TStrings 继承其方法,该方法有效。
任何帮助将不胜感激。问候。