gpt4 book ai didi

sql-server - 出现 "data too large for variable"错误时如何正确访问 FireDAC 数据集的 VARCHAR(MAX) 参数值?

转载 作者:行者123 更新时间:2023-12-04 12:46:10 26 4
gpt4 key购买 nike

我们的应用程序使用 SQL Server 2014 更新和访问数据。

我有一个表格,其中最后一列(“内容”)被创建为 VARCHAR(MAX) .

我们正在使用 Delphi XE8,并且正在使用 FireDAC TFDQuery组件来更新此列。

.....
FDquery.ParamByName('Contents').AsString:=Contents;
FDquery.ExecSQL;

运行此更新时,我收到以下错误:

Exception raised with message [FireDAC][Phys][ODBC]-345. Data too large for variable [CONTENTS]. Max len = [8002], actual len = [13829] Hint: set the TFDParam.Size to a greater value.



“内容”可以是不同长度的字符串。

浏览网页时,我发现的唯一合理简单的解决方案是按如下方式更改查询:
 FDquery.ParamByName('Contents').AsWideMemo:=Contents;
FDquery.ExecSQL;

这是可以接受的,还是我应该以不同的方式处理?

正如我所提到的,'Contents' 没有什么特别之处,它只是一个长字符串。

最佳答案

通过 AsWideMemo 属性访问 VARCHAR(MAX) 类型字段参数值是否可以接受?

不是特别。对于 VARCHAR(MAX)字段参数使用 AsMemo使用权。这是因为您可能将 Unicode 值发送到您的 DBMS Unicode 值到非 Unicode 字段。来自 the reference :

The Unicode encoded parameter value is converted to a Unicode character set, which is supported by the DBMS, and sent to the DBMS. This does not depend on a client character set or on a Delphi version.



如果您的字段是 NVARCHAR(MAX) , 使用 AsWideMemo访问参数值将是正确的选择。

当 AsString 属性分配超过 8k 个字符的长字符串时,为什么会出现“数据对于变量而言太大”错误?

为什么会发生这种情况的一些背景。通过 As<T> 访问某个参数值属性,引擎还设置了参数 DataType ,如果您之前没有明确这样做。在这种特殊情况下,您暗示引擎如果将参数数据类型设置为 ftWideString 就可以了。或 ftString只需通过 AsString 访问参数值属性(property)。

并且由于数据类型映射,此类参数被视为 VARCHAR[n]NVARCHAR[n]数据类型包括其限制(因此您在此处遇到字符串长度限制错误)。

类似地,当您通过 AsMemo 访问参数值时,会使用更具体的数据类型提示。属性,默认为 ftMemo映射到 VARCHAR(MAX) 的数据类型.正如你所预测的那样,
AsWideMemo访问默认为 ftWideMemo映射到 NVARCHAR(MAX)数据类型。如果您不想显式设置参数数据类型而是使用此提示,请查阅手册以了解每个使用的访问属性如何设置默认参数数据类型。

关于sql-server - 出现 "data too large for variable"错误时如何正确访问 FireDAC 数据集的 VARCHAR(MAX) 参数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40344102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com