我有一些访问sql Server 2005的
Java代码,如下所示:
CallableStatement cstmt = ...; ... // Set input parameters cstmt.registerOutParameter(11,Types.INTEGER); cstmt.execute(); int out = cstmt.getInt(11);
从最后一行抛出以下异常:
com.microsoft.sqlserver.jdbc.sqlServerException: The value is not set for the parameter number 0. at com.microsoft.sqlserver.jdbc.sqlServerException. makeFromDriverError(Unknown Source) at com.microsoft.sqlserver.jdbc.sqlServerCallableStatement. skipOutParameters(Unknown Source) at com.microsoft.sqlserver.jdbc.sqlServerCallableStatement. getOutParameter(Unknown Source) at com.microsoft.sqlserver.jdbc.sqlServerCallableStatement. getterGetParam(Unknown Source) at com.microsoft.sqlserver.jdbc.sqlServerCallableStatement. getInt(Unknown Source) at org.jboss.resource.adapter.jdbc.WrappedCallableStatement. getInt(WrappedCallableStatement.java:192)
被调用的存储过程看起来像这样:
CREATE PROCEDURE dbo.stored_proc ( -- 10 input parameters,@out_param INT OUTPUT) AS -- Variable declarations SET @out_param = 0 -- Do processing... SET @out_param = 1
由于输入参数在进入存储过程时设置为零,在什么情况下可以设置该值?或者我误解了错误信息?
此错误可通过以下方式重现:
> sql Server JDBC驱动程序1.2
> sql Server 2005(64位)Service Pack 2
> sql Server 2005(64位)Service Pack 3
更新:它似乎是由于 – 处理…存储过程的一部分而发生的.删除它可以消除错误.这里有太多的代码可以重现,我想要的是一些可能导致缩小可能候选人的原因.
更新:将错误(例如除以零)注入 – Do处理…部分存储过程不会导致抛出此异常(相反,正如预期的那样,execute()调用失败并显示相应的错误消息) .
更新:反编译com.microsoft.sqlserver.jdbc.sqlServerCallableStatement类建议’参数号0’是存储过程返回值.
更新:我无法通过Management Studio直接调用存储过程来重现此问题.
更新:此错误的最终原因似乎是存储过程中的死锁.但是,通常,死锁导致execute()调用失败,并带有sql Server错误代码1205的sqlException …