无法将 NewProxyCallableStatement 强制转换为 SQLServerCallableStatement
NewProxyCallableStatement cannot be cast to SQLServerCallableStatement
我有一个接受连接的通用 API。似乎其中一个调用者传递了一个连接,prepareCall
其中 returns 是一个 NewProxyCallableStatement
类型的对象。然后以下代码失败:
SQLServerCallableStatement stmt = (SQLServerCallableStatement) connection.prepareCall(sprocSQL);
API 的调用者看到的完整异常是:
java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyCallableStatement cannot be cast to com.microsoft.sqlserver.jdbc.SQLServerCallableStatement
我需要使用 SQLServerCallableStatement
,因为我正在使用类型为 TABLE
的输入参数调用存储过程,并且 SQLServerCallableStatement
有一个 setStructured
方法,它允许构造 table类型变量。
解决方法是使用下面的代码:
SQLServerCallableStatement stmt = connection.prepareCall(sprocSQL).unwrap(com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.class);
如果您使用的是 c3p0,则需要使用已修复 unwrap
错误的版本。我用 c3p0-0.9.5.2
.
测试了上面的内容
我有一个接受连接的通用 API。似乎其中一个调用者传递了一个连接,prepareCall
其中 returns 是一个 NewProxyCallableStatement
类型的对象。然后以下代码失败:
SQLServerCallableStatement stmt = (SQLServerCallableStatement) connection.prepareCall(sprocSQL);
API 的调用者看到的完整异常是:
java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyCallableStatement cannot be cast to com.microsoft.sqlserver.jdbc.SQLServerCallableStatement
我需要使用 SQLServerCallableStatement
,因为我正在使用类型为 TABLE
的输入参数调用存储过程,并且 SQLServerCallableStatement
有一个 setStructured
方法,它允许构造 table类型变量。
解决方法是使用下面的代码:
SQLServerCallableStatement stmt = connection.prepareCall(sprocSQL).unwrap(com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.class);
如果您使用的是 c3p0,则需要使用已修复 unwrap
错误的版本。我用 c3p0-0.9.5.2
.