4

我正在使用德尔福 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),而不是原始数据。

这是将字符串字段从 a 保存TSQLQuery到文件的正确方法吗?我选择使用TStringStream是因为我最终会添加代码来对流上的数据执行其他操作,而使用TFileStream.

4

1 回答 1

5

TStringStreamis TEncoding-aware 在 XE2 中,但您没有在构造函数中指定任何编码,因此TEncoding.Default将使用,这意味着您提供给它的任何字符串都将在内部转换为操作系统默认的 Ansi 编码。确保编码支持您尝试使用的 Unicode 字符,或者指定更合适的编码,例如TEncoding.UTF8.

还要确保它AsString返回一个有效且正确的UnicodeString值。TStringStream如果将垃圾作为输入,将无法正确保存数据。确保FieldByName()返回一个指向TWideStringField对象而不是TStringField对象的指针,以便正确处理数据库的 Unicode 数据。

于 2012-08-31T07:21:58.957 回答