0

我在使用 FireDAC 和中文字符串时遇到了一个奇怪的行为(猜想这也发生在任何其他 unicode 字符串中)。

我有一个这样的查询:

Q.SQL.Add('select count(*) as CNT from TABLE where F = :P');

在表中,字段 F 是一个 varchar(255)。

V: Variant;
V := '你好'; // the string means 'Hello'

Q.ParamByName('P').Value := V; // Value is a Variant property

最初我虽然问题是 varchar 与 nvarchar,但问题发生在内部 FireDac 参数分配之前,比针对 RDBMS 的操作要早得多。

奇怪的是,一旦分配了 FireDac 参数,它就会变成 '??',并转换为 varString。

相反,如果我写:

Q.ParamByName('P').AsWideString := V; // AsWideString is a UnicodeString property

它工作正常。

对我来说,这似乎是一种不自然的行为,因为变体变量 V 知道内容是 varUString,所以在分配给 FDParam 期间字符串被转换(错误)为 varString 是非常出乎意料的。

以前有人注意到这种行为吗?

谢谢

4

1 回答 1

1

TFDParam包括 aDataTypeFDDataType属性。

当您分配一个变量时,它将根据参数的类型进行分配 - 毕竟您可能希望将一个整数插入数据库并将其传递给整数的字符串表示形式。

我在过去发现根据值和底层架构有时需要设置数据类型和 FDDataType。

于 2021-08-25T15:32:15.147 回答