我有一个存储过程,输入参数为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
参数。
我正在尝试找出如何停止错误。到目前为止,我的想法是:
OdbcParameter
时指定大小; XDocument
,所以我觉得添加空格不会有任何区别); SqlConnection
而不是OdbcConnection
来查看问题是否消失。但是因为我无法重新创建该错误,所以这完全是黑暗中的一击。 导致该错误的实际原因是什么,什么是修复该错误的最佳方法?我知道数据页有某种变化,或者长度超过8000的varchar都有变化,但是我找不到与ODBC相关的任何具体信息。
答案 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以下的值进行了测试,只是为了验证。