【问题标题】:JDBC com.ibm.as400.access.AS400JDBCDriver CallableStatement java.sql.SQLExceptionJDBC com.ibm.as400.access.AS400JDBCDriver CallableStatement java.sql.SQLException
【发布时间】: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 的情况下重写它?

标签: java jdbc db2 jt400


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多