1

私はDelphiXE2で以下のコードを書きました。

var
stream : TStringStream;

begin
stream := TStringStream.Create;

//Some logic to populate stream from memo.

ShowMessage(stream.datastring); //This line is showing correct data

// some Insert query with below parameter setting
ParamByName('Text').LoadFromStream(stream , ftMemo);

しかし、これはテキストを????として保存しています テーブルで。

このタイプのコードは、Delphi4では正常に機能しています。

Delphi XE2のTParam.LoadFromStream関数に問題はありますか?

編集: テーブルフィールドのタイプは「テキスト」です。

4

2 に答える 2

1

いくつかの試行錯誤の方法を実行した後、私はこの問題の解決策を見つけました。以下のコードを使用できます、

ParamByName('Text').AsMemo := SampleMemo.Text;
于 2012-05-16T10:31:11.693 に答える
1

問題の根本はTStringStream、D2009+ではD4と同じように動作しないことです。

D4では、変数TStringStreamの単純なラッパーでした。AnsiStringプロパティは単にそのDataString変数への直接参照を返し、すべての読み取り/書き込みは変数の内容に直接作用しました。ストリームのバイトと文字列文字は、当時は基本的に同じものでした。

D2009 +では、代わりにエンコードされたバイトTStringStreamの配列のラッパーにTBytesなりました。デフォルトのエンコードは、アプリが実行されているOSのデフォルトのAnsiエンコードです。を使用して文字列をストリームに書き込むとWriteString()、ストリームのエンコーディングを使用してUnicodeからバイトにエンコードされ、エンコードされたバイトが保存されます。を使用してストリームから文字列を読み取るReadString()か、DataStringプロパティを読み取ると、格納されているバイトはUnicode文字列にデコードされます。他の読み取り/書き込み操作は、他のストリームタイプと同様に、代わりに生のエンコードされたバイトで動作します。したがって、を呼び出すとTParam.LoadFromStream()、Unicode文字列ではなく、エンコードされた生のバイトが読み取られます。ストリームの生のバイトと文字列文字は、もはや同じものではありません。したがって、ShowMessage()見るのと同じデータではありませんTParam

于 2012-05-16T17:49:30.213 に答える