我在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函数有问题吗?
修改 表字段的类型为“文本”。
答案 0 :(得分:1)
在做了一些试错法后,我找到了解决这个问题的方法。 我们可以使用下面的代码,
ParamByName('Text').AsMemo := SampleMemo.Text;
答案 1 :(得分:1)
问题的根源在于TStringStream
在D2009 +中的操作方式与在D4中的操作方式不同。
在D4中,TStringStream
是AnsiString
变量的简单包装器。 DataString
属性只返回对该变量的直接引用,并且所有读/写操作都直接对变量的内容进行操作。流的字节和字符串字符基本上是同一个东西。
在D2009 +中,TStringStream
现在是TBytes
编码字节数组的包装,而默认编码是运行应用程序的操作系统的默认Ansi编码。如果使用WriteString()
将字符串写入流,则使用流的编码将其从Unicode编码为字节,然后存储这些编码的字节。如果使用ReadString()
从流中读取字符串,或者读取DataString
属性,则存储的字节将解码为Unicode字符串。相反,任何其他读/写操作都会对原始编码字节进行操作,就像任何其他流类型一样。因此,当您调用TParam.LoadFromStream()
时,它正在读取原始编码字节,而不是Unicode字符串。流的原始字节和字符串字符是 NOT 一个,并且相同的东西。因此,您在ShowMessage()
中看到的数据与TParam
看到的数据不同。