无法将 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.

测试了上面的内容

参考: unwrap Method (SQLServerCallableStatement)