将长 Unicode 字符串传递给 FireDac TADQuery 参数

Posted

技术标签:

【中文标题】将长 Unicode 字符串传递给 FireDac TADQuery 参数【英文标题】:Pass long Unicode strings to FireDac TADQuery parameter 【发布时间】:2014-01-28 09:41:15 【问题描述】:

我使用 AsWideString 将 Unicode 字符串传递给 TADQuery 参数。

ADQuery.Params.ParamByName('MyFld').AsWideString

但是当字符串变得太长时出现错误:

[MyFld]. Max len = [8002], actual len = [10522]

然后我决定使用 AsMemo 属性

ADQuery.Params.ParamByName('MyFld').AsMemo

在这种情况下,我的 Unicode 字符串显示不正确。

解决这两个问题的方法是什么?

【问题讨论】:

@David,FireDAC 按照您的预期实现它,但请参见例如***.com/a/16140053/960757。常见的数据集提供者(谁知道,也许是)被实现为 AsString getter 用于从底层数据库返回 ANSI 字符串。即使在 Unicode Delphi 中。这是一个陷阱。 【参考方案1】:

TFParam 类型在 XE5 中有一个 .AsWideMemo,它应该正确接受 unicode 字符并绕过您遇到的大小限制。

ADQuery.Params.ParamByName('MyFld').AsWideMemo := 'Some unicode string';

【讨论】:

【参考方案2】:

实际的数据库字段具有分配给它的最大字符数限制。您不能设置超过该限制的值。它会截断值,或者在您的情况下引发错误。您不能使用AsMemo 设置非备注字段。继续使用AsWideString 并注意您的数据库布局。

【讨论】:

我会说事实并非如此。如果您有一个 NVARCHAR(MAX) 字段并使用长度超过 8002 个字符的 AsString/AsWideString 参数,则会收到此确切错误。推荐的解决方案是使用 AsMemo,但在 OP 无法使用 unicode 的情况下。 AsWideString 将参数类型更改为ftWideString,通过预定义的数据类型映射结果到具有限制的数据类型,例如在 SQL Server 上到 nvarchar[n],其中 n 最多可以是 4k。因此,如果后面的 SQL Server 上有 nvarchar[max] 之类的列,则使用 AsWideString 实际上会降低存储字符串长度的限制。 @Jason 在这里是正确的。

以上是关于将长 Unicode 字符串传递给 FireDac TADQuery 参数的主要内容,如果未能解决你的问题,请参考以下文章

我可以将长 bash 命令传递给 asyncio.subprocess.create_subprocess_exec() 吗?

Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库

FireDAC 下的 Sqlite [9] - 关于排序,

无法检索传递给 unicode 窗口的 wchar 文本

如何使用 Unicode 集将 std::string 传递给 CreateDirectory

lxml 解析字符处理规则