ODBC varchar(max)参数似乎抛出8000个字符的“ HY104-无效的精度值”

时间:2018-09-10 10:00:29

标签: c# sql-server odbc

我有一个存储过程,输入参数为varchar(max),我们正在将此参数插入类型为varchar(max)的表列中(例如,长度设置为-1)。
我使用ODBC是因为我们已配置为使用DSN(这是旧版应用程序)。

我的OdbcParameter被指定为OdbcType.VarChar

使用ExecuteNonQuery进行调用,当数据正好是8000个字符时,它将引发以下异常:

  

InnerException:消息:错误[HY104] [Microsoft] [ODBC SQL Server驱动程序]无效的精度值   StackTrace:位于System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle,RetCode retcode)      在System.Data.Odbc.OdbcParameter.Bind(OdbcStatementHandle hstmt,OdbcCommand命令,Int16序数,CNativeBuffer参数缓冲区,布尔值allowReentrance)      在System.Data.Odbc.OdbcParameterCollection.Bind(OdbcCommand命令,CMDWrapper cmdWrapper,CNativeBuffer parameterBuffer)      在System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior行为,字符串方法,布尔NeedReader,Object []方法参数,SQL_API odbcApiMethod)      在System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior行为,String方法,布尔型NeedReader)      在System.Data.Odbc.OdbcCommand.ExecuteNonQuery()

我无法在本地重新创建此文件(我们的生产系统中发生了错误,因此无法在此处运行手动测试)。

在研究代码时,我注意到在创建OdbcParameter时,我们没有设置Size参数。

我正在尝试找出如何停止错误。到目前为止,我的想法是:

  1. 在创建OdbcParameter时指定大小;
  2. 如果长度恰好是8000,请在末尾添加一个空格(它是XML,因此当读出时,它将被解析为XDocument,所以我觉得添加空格不会有任何区别);
  3. 也许尝试使用SqlConnection而不是OdbcConnection来查看问题是否消失。

但是因为我无法重新创建该错误,所以这完全是黑暗中的一击。 导致该错误的实际原因是什么,什么是修复该错误的最佳方法?我知道数据页有某种变化,或者长度超过8000的varchar都有变化,但是我找不到与ODBC相关的任何具体信息。

2 个答案:

答案 0 :(得分:1)

Windows 2000附带的SQL Server ODBC驱动程序尚未针对SQL 2000之后引入的新功能进行更新,仅用于与向SQL 2005之前开发的旧应用程序要求向后兼容时使用世界。

尝试使用现代的ODBC驱动程序,例如ODBC Driver 17 for SQL Server,它直接支持SQL 2005中引入的varchar(MAX)数据类型。

答案 1 :(得分:0)

尽管我仍然不确定确切的原因,但我发现将Size上的OdbcParameter字段设置为数据的实际大小似乎可以解决此问题。

也使用恰好在8000以下的值进行了测试,只是为了验证。