Вот моя архитектура:Delphi, TBLOBField и UTF8
DataSnap Client < => DATASNAP Сервер < => Oracle 11 XE
Я использую удаленный провайдер с TDSPROVIDERCONNECTION на стороне клиента, чтобы получить доступ к моей набор данных ,
В принципе, я использую компонент TIdHTTP для запроса веб-сайта и сохранения результата в столбце Oracle CLOB.
При сохранении результата в файл отображаются текстовые, акцентированные и другие экзотические символы. тот же текст, вставленный в clob с использованием sqldeveloper, также отображается правильно.
Но когда я делаю это через DATASNAP архитектуры, неправильные символы показывает вверх (как черные бриллианты или «upperscore» (подчеркивание сверху)
Мой DB Charset является AL32UTF8, что кодировка по умолчанию на Oracle 11 ХЕ.
чтобы лучше понять, где проблема, я переписал часть моего клиента, чтобы получить доступ к своей базе данных напрямую. и я могу сказать, что проблема не в связи между DataSnap клиентом и сервером.
Теперь моя архитектура это:
Клиент < => База данных
И я получить доступ к Oracle XE следующим образом:
TClientDataSet < => TDataSetProvider < => TSQLDataset < => TSQLConnection
Ответ TIdHTTP, который является TMemoryStream
, хранится в TClientDataset с:
With ClientDataSet do
begin
Edit;
(Fieldbyname('MYCLOBFIELD') as TBlobField).LoadFromStream(MS);
ApplyUpdates(-1);
end;
EDIT: 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 наследует свой метод LoadFromFile/LoadFromStream
от TStrings, который работает.
Любая помощь будет принята с благодарностью. С уважением.