TSQLQuery.FieldByName ().AsString - > TStringStream Повреждает Данные



Я использую Delphi XE2. Мой код извлекает данные из базы данных SQL-Server 2008 R2. Возвращаемые данные представляют собой поле nvarchar(max) с 1 055 227 байтами данных. Я использую следующий код для сохранения данных поля в файл:



procedure WriteFieldToFile(FieldName: string; Query: TSQLQuery);
var
ss: TStringStream;
begin
ss := TStringStream.Create;
try
ss.WriteString(Query.FieldByName(FieldName).AsString);
ss.Position := 0;
ss.SaveToFile('C:Test.txt');
finally
FreeAndNil(ss);
end;
end;


Когда я просматриваю файл в шестнадцатеричном средстве просмотра, первые 524 287 байт (ровно 1/2 Мег) выглядят правильно. Остальные байты (от 524 288 до 1 055 227) - это все нули (#0), а не исходные данные.



Является ли это правильным способом сохранения строкового поля из TSQLQuery в файл? Я решил использовать TStringStream, потому что в конечном итоге я добавлю код, чтобы сделать другие вещи с данными в потоке, которые я не могу сделать с TFileStream.

540   1  

1 ответ:

TStringStream is TEncoding - aware в XE2, но вы не задаете никакой кодировки в конструкторе, поэтому будет использоваться TEncoding.Default, что означает, что любая строка, которую вы предоставляете ему, будет внутренне преобразована в кодировку Ansi по умолчанию для ОС. Убедитесь, что кодировка поддерживает символы Юникода, с которыми вы пытаетесь работать, или укажите более подходящую кодировку, например TEncoding.UTF8.

Также убедитесь, что AsString возвращает допустимое и правильное значение UnicodeString Для начала. TStringStream не будет сохранять данные правильно, если в качестве входных данных дается мусор. Убедитесь, что FieldByName() возвращает указатель на объект TWideStringField, а не на объект TStringField, Чтобы корректно обрабатывать данные базы данных в Юникоде.

Comments

    Ничего не найдено.