JDBC com.ibm.as400.access.AS400JDBC驱动程序 CallableStatement java.sql.SQLException

JDBC com.ibm.as400.access.AS400JDBCDriver CallableStatement java.sql.SQLException

我们有以下代码使用 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: The number of parameter values set or registered does not match the number of parameters"

更改代码在这里。

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:设置或注册的参数值数量与参数数量不匹配

通过将第四个参数设置为 INOUT 参数来解决此问题,如下所示。

cs.setString(4,"");
cs.registerOutParameter(4,Types.VARCHAR);