2012-05-17 4 views
2

Вот моя архитектура: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, который работает.

Любая помощь будет принята с благодарностью. С уважением.

ответ

1

Если вы хотите поместить некоторые данные 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; 
Смежные вопросы