TParam.LoadFromStream在Delphi XE2中不起作用?

时间:2012-05-15 11:18:38

标签: delphi delphi-xe2

我在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函数有问题吗?

修改 表字段的类型为“文本”。

2 个答案:

答案 0 :(得分:1)

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

ParamByName('Text').AsMemo := SampleMemo.Text;

答案 1 :(得分:1)

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

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

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