4

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;

16 進ビューアでファイルを調べると、最初の 524,287 バイト (正確には 1/2 メガバイト) が正しいように見えます。残りのバイト (524,288 ~ 1,055,227) は、元のデータではなく、すべてヌル (#0) です。

TSQLQueryこれは、文字列フィールドを からファイルに保存する正しい方法ですか? 私が使用するTStringStreamことにしたのは、最終的にはストリーム上のデータに他のことを行うコードを追加するためですTFileStream

4

1 に答える 1

5

TStringStreamXE2ではTEncoding-aware ですが、コンストラクターでエンコーディングを指定していないため、コンストラクターに指定したTEncoding.Default文字列が使用されます。つまり、コンストラクターに指定した文字列は、OS の既定の Ansi エンコーディングに内部的に変換されます。使用しようとしている Unicode 文字がエンコーディングでサポートされていることを確認するか、より適切なエンコーディング ( TEncoding.UTF8.

また、最初にAsString有効で正しいUnicodeString値が返されていることを確認してください。TStringStream入力としてガベージが与えられた場合、データを正しく保存しません。データベースの Unicode データを正しく処理するために、 がオブジェクトではなくオブジェクトFieldByName()へのポインタを返すことを確認してください。TWideStringFieldTStringField

于 2012-08-31T07:21:58.957 に答える