1

我在 Delphi XE2 中编写了以下代码。

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);

但这将文本存储为???? 在表中。

这种类型的代码在 Delphi 4 中运行良好。

Delphi XE2 中的 TParam.LoadFromStream 函数有什么问题吗?

编辑: 表格字段的类型为“文本”。

4

2 回答 2

1

您问题的根源TStringStream在于 D2009+ 中的操作方式与 D4 中的操作方式不同。

在 D4 中,TStringStream是一个简单的AnsiString变量包装器。该DataString属性只是返回对该变量的直接引用,并且所有读/写操作都直接在该变量的内容上进行。流的字节和字符串字符在当时基本上是一回事。

在 D2009+ 中,TStringStream现在是围绕TBytes编码字节数组的包装器,其中默认编码是您的应用程序运行的操作系统的默认 Ansi 编码。如果使用 将字符串写入流WriteString(),它会使用流的编码从 Unicode 编码为字节,然后存储这些编码的字节。如果使用ReadString()或读取DataString属性从流中读取字符串,则存储的字节将被解码为 Unicode 字符串。任何其他读/写操作都对原始编码字节进行操作,就像任何其他流类型一样。因此,当您调用 时TParam.LoadFromStream(),它正在读取原始编码字节,而不是 Unicode 字符串。流的原始字节和字符串字符不再是一回事了。所以你看到的数据ShowMessage()不是TParam看到的相同数据。

于 2012-05-16T17:49:30.213 回答
1

在做了一些试验和错误方法之后,我找到了解决这个问题的方法。我们可以使用下面的代码,

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