【问题标题】:SQL Server varchar(MAX) parameter results in "Parameter object is improperly defined"SQL Server varchar(MAX) 参数导致“参数对象定义不正确”
【发布时间】:2010-10-18 16:45:21
【问题描述】:

我在表中有一个字段,我想存储一个可能很长的错误字符串。为此,我选择了 varchar(MAX) 作为数据类型。我创建了一个存储过程,用于在表中输入该数据,对于字段“ErrorDescription”,我使用了以下参数定义。

@ErrorDescription as varchar(MAX)

问题出在调用存储过程以记录错误的 ADO 过程中(在 Access 2003 中)。我将错误描述作为字符串值并尝试将其分配给参数...

cmd.Parameters("@ErrorDescription").Value = errorDescription

但它失败并出现以下错误。

“参数对象定义不正确”

如果我将存储过程定义更改为 ...

 @ErrorDescription as varchar(255)

然后一切正常。如何定义存储过程参数以接受可能很长的字符串? varchar(MAX) 是否使用了错误的数据类型?谢谢。

编辑 我应该提到我使用的 SQL Server 版本。我正在使用 SQL Server 2008。

【问题讨论】:

  • 是否可以使用 varchar(max) 字段作为参数?我不确定...
  • 好吧,拥有 commandText 值仍然很有趣,只是为了检查是否允许与参数一起使用的运算符(例如,“文本”字段不允许使用 LIKE)。检查 ADODB 连接如何评估此 varchar(max) 字段及其属性也会很有趣。它可能会错误地将其视为“文本”类型字段,因为 nvarchar(max) 类型比 ADODB 驱动程序更新。

标签: sql-server ms-access varcharmax


【解决方案1】:

varchar(MAX) 是在 SQL Server 2005 版中引入的。我假设您使用的是 2000 版。如果是这样,那么您可以使用 varchar(8000)Text

【讨论】:

  • 我最终将存储过程中的参数设置为 varchar(8000) 并且一切正常。
【解决方案2】:

我猜 Access 2003 不知道 MAX 关键字代表什么,因为这是在 SQL 2005 中引入的。我不确定您是否可以通过使用 TEXT 数据类型和 SQL 来欺骗 Access但是,是否正确地将其映射到 VARCHAR(MAX) 列。

【讨论】:

  • Access 与它没有任何关系。 VarChar() 根本不是 Access,只能在传递查询中使用。如果这是上下文,那么一切都可以工作,因为传递的全部意义在于 Access/Jet/ACE 不会触及它,而只是将其直接发送到服务器进行处理。
【解决方案3】:

我会首先查看数据库中列的定义以确认数据类型。

SQL_LONGVARCHAR 是映射到备注字段的服务器类型,我假设它是您想要用于此数据的 Access 数据类型。如果该假设正确,您似乎需要将服务器数据类型更改为 SQL_LONGVARCHAR(例如,将列创建为类型“text”而不是“varchar(max)”)。

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多