in src/main/java/org/apache/commons/dbutils/AbstractQueryRunner.java [303:353]
public void fillStatement(final PreparedStatement stmt, final ParameterMetaData pmd, final Object... params)
throws SQLException {
// check the parameter count, if we can
if (!pmdKnownBroken && pmd != null) {
final int stmtCount = pmd.getParameterCount();
final int paramsCount = params == null ? 0 : params.length;
if (stmtCount != paramsCount) {
throw new SQLException("Wrong number of parameters: expected "
+ stmtCount + ", was given " + paramsCount);
}
}
// nothing to do here
if (params == null) {
return;
}
CallableStatement call = null;
if (stmt instanceof CallableStatement) {
call = (CallableStatement) stmt;
}
for (int i = 0; i < params.length; i++) {
if (params[i] != null) {
if (call != null && params[i] instanceof OutParameter) {
((OutParameter<?>) params[i]).register(call, i + 1);
} else {
stmt.setObject(i + 1, params[i]);
}
} else {
// VARCHAR works with many drivers regardless
// of the actual column type. Oddly, NULL and
// OTHER don't work with Oracle's drivers.
int sqlType = Types.VARCHAR;
if (!pmdKnownBroken) {
// TODO see DBUTILS-117: does it make sense to catch SQLEx here?
try {
/*
* It's not possible for pmdKnownBroken to change from true to false, (once true, always true) so pmd cannot be null here.
*/
sqlType = pmd.getParameterType(i + 1);
} catch (final SQLException e) {
pmdKnownBroken = true;
}
}
stmt.setNull(i + 1, sqlType);
}
}
}