0

We have below code using JDBC ODBC bridge to connect to IBM iAccess but since JDK 8 upgrade the support for JDBC ODBC bridge is no longer there.

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();

So we used correct jt400.jar JDBC driver for ibm iAccess and changed just connection code, but we get error

"java.sql.SQLException: The number of parameter values set or registered does not match the number of parameters"

Changed code is here.

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();

Not sure why we get Exception java.sql.SQLException: The number of parameter values set or registered does not match the number of parameters

mao
  • 11,321
  • 2
  • 13
  • 29
user2101374
  • 61
  • 1
  • 8
  • Please show the definition of this stored procedure. Not related to your problem, but user code should **not** call `DriverManager.registerDriver`. That method is only for drivers to register themselves when they are loaded (either through automatic driver loading, or by **only** using `Class.forName`). – Mark Rotteveel Jan 28 '20 at 08:37
  • Unfortunately this is for a client and we did ask for SP code and they said they dont have access to look at SP as it is within an AS400 application. How do you suggest I should re-write it without calling DriverManager.registerDriver? – user2101374 Jan 28 '20 at 14:42

1 Answers1

0

This got fixed by setting fourth parameter as INOUT parameter as done below.

cs.setString(4,"");
cs.registerOutParameter(4,Types.VARCHAR);
user2101374
  • 61
  • 1
  • 8