【发布时间】:2020-01-27 22:15:33
【问题描述】:
我们有下面的代码使用 JDBC ODBC 桥连接到 IBM iAccess,但自从 JDK 8 升级后,对 JDBC ODBC 桥的支持不再存在。
DriverManager.registerDriver((Driver) Class.forName("sun.jdbc.odbc.JDBCODBCDriver").newInstance()); Connection con = DriverManager.getConnection(jdbcURL, userName, password);
CallableStatement cs = con.prepareCall("{ call IDBMOD.SPGIFTHOLD(?,?,?,?) }");
String acctNum = doc.getElementsByTagName("account_number").item(0).getTextContent();
String amount = doc.getElementsByTagName("amount").item(0).getTextContent();
String valueDate = doc.getElementsByTagName("value_date").item(0).getTextContent();
String returnCode = "";
cs.setString(1, acctNum);
cs.setString(2, amount);
cs.setString(3, valueDate);
cs.registerOutParameter(4, Types.VARCHAR);
boolean ret = cs.execute();
所以我们为 ibm iAccess 使用了正确的 jt400.jar JDBC 驱动程序并只更改了连接代码,但我们得到了错误
"java.sql.SQLException: 设置的参数值个数或 注册的参数数量不匹配”
更改的代码在这里。
DriverManager.registerDriver((Driver) Class.forName("com.ibm.as400.access.AS400JDBCDriver").newInstance());
Connection con = DriverManager.getConnection(jdbcURL, userName, password);
CallableStatement cs = con.prepareCall("{ call IDBMOD.SPGIFTHOLD(?,?,?,?) }");
String acctNum = doc.getElementsByTagName("account_number").item(0).getTextContent();
String amount = doc.getElementsByTagName("amount").item(0).getTextContent();
String valueDate = doc.getElementsByTagName("value_date").item(0).getTextContent();
String returnCode = "";
cs.setString(1, acctNum);
cs.setString(2, amount);
cs.setString(3, valueDate);
cs.registerOutParameter(4, Types.VARCHAR);
boolean ret = cs.execute();
不确定为什么会出现异常java.sql.SQLException:设置或注册的参数值的数量与参数的数量不匹配
【问题讨论】:
-
请显示此存储过程的定义。与您的问题无关,但用户代码应该不调用
DriverManager.registerDriver。该方法仅适用于驱动程序在加载时注册自己(通过自动加载驱动程序,或仅使用Class.forName)。 -
不幸的是,这是针对客户的,我们确实要求提供 SP 代码,但他们说他们无权查看 SP,因为它位于 AS400 应用程序中。您如何建议我在不调用 DriverManager.registerDriver 的情况下重写它?