将长 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函数库