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

JDBC com.ibm.as400.access.AS400JDBCDriver CallableStatement java.sql.SQLException,java,jdbc,db2,jt400,Java,Jdbc,Db2,Jt400,下面的代码使用JDBCODBC桥连接到IBMIAccess,但由于JDK8升级,对JDBCODBC桥的支持已不复存在 DriverManager.registerDriver((Driver) Class.forName("sun.jdbc.odbc.JDBCODBCDriver").newInstance()); Connection con = DriverManager.getConnection(jdbcURL, userName, password); CallableStateme

下面的代码使用JDBCODBC桥连接到IBMIAccess,但由于JDK8升级,对JDBCODBC桥的支持已不复存在

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();
所以我们为IBMIAccess使用了正确的jt400.jarJDBC驱动程序,只更改了连接代码,但我们得到了错误

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

通过将第四个参数设置为INOUT参数(如下所示),这一问题得到了解决

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

请显示此存储过程的定义。与您的问题无关,但用户代码不应调用
DriverManager.registerDriver
。该方法仅适用于驱动程序在加载时进行自我注册(通过自动加载驱动程序,或仅使用
Class.forName
)。不幸的是,这是针对客户端的,我们要求提供SP代码,他们说他们无权查看SP,因为SP位于AS400应用程序中。您建议我如何在不调用DriverManager.registerDriver的情况下重新编写它?