Почему этот Java PreparedStatement выбрасывает ArrayIndexOutOfBoundsException 0 с параметромIndex = 1? - PullRequest
1 голос
/ 09 июля 2009

Следующий метод, когда вызывается с чем-то вроде String val = getCell("SELECT col FROM table WHERE LIKE(other_col,'?')", new String[]{"value"}); (это SQLite), выдает java.lang.ArrayIndexOutOfBoundsException: 0 at org.sqlite.PrepStmt.batch(PrepStmt.java:131). Кто-нибудь может пожалеть моего бедного неуклюжего здесь и помочь мне с почему ?

/**
 * Get a string representation of the first cell of the first row returned
 * by <code>sql</code>.
 *
 * @param sql        The SQL SELECT query, that may contain one or more '?'
 *                   IN parameter placeholders.
 * @param parameters A String array of parameters to insert into the SQL.
 * @return           The value of the cell, or <code>null</code> if there
 *                   was no result (or the result was <code>null</code>).
 */
public String getCell(String sql, String[] parameters) {
    String out = null;
    try {
        PreparedStatement ps = connection.prepareStatement(sql);
        for (int i = 1; i <= parameters.length; i++) {
            String parameter = parameters[i - 1];
            ps.setString(i, parameter);
        }
        ResultSet rs = ps.executeQuery();
        rs.first();
        out = rs.getString(1);
        rs.close();
        ps.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return out;
}

В этом случае setString() будет ps.setString(1, "value") и не должно быть проблемой. Очевидно, что я ошибаюсь.

Большое спасибо заранее.

1 Ответ

4 голосов
/ 09 июля 2009

теряйте кавычки вокруг знака вопроса. Это должно быть LIKE(other_col,?). Подготовленный оператор выяснит, что у вас есть строка, и сам добавит кавычки.

(действительно ли SQLite выполняет LIKE как функцию LIKE(x,y) вместо оператора x LIKE y?)

...