我有一个接受连接的通用API。似乎有一个调用方通过了一个连接,该连接的prepareCall
返回一个类型为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
方法。 最佳答案
解决方案是使用以下代码:
SQLServerCallableStatement stmt = connection.prepareCall(sprocSQL).unwrap(com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.class);
如果使用的是c3p0,则需要使用已修复
unwrap
错误的版本。我用c3p0-0.9.5.2
测试了以上内容。参考:
unwrap Method (SQLServerCallableStatement)