2009-07-09 2 views
1

Следующий метод, когда вызывается с чем-то вроде 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). Может ли кто-нибудь пожалеть о моем бедном неуклюже здесь и помочь мне с почему?Почему это Java PreparedStatement бросает ArrayIndexOutOfBoundsException 0 с параметромIndex = 1?

/** 
* 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; 
} 

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

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

ответ

4

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

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

+0

Я думаю, что Sqlite делает и ... х LIKE у эквивалентно вызову скалярная функция LIKE (х, у) , который позволяет вам переопределить, как работает оператор, переопределяя функцию ... – Stobor

+2

Какое отвратительное использование надстрочного текста, который был :-) – paxdiablo

+0

Спасибо! Так просто. И я думаю, что я все еще использовал LIKE (x, y), потому что я заменил какую-то другую функцию; У SQLite есть оператор LIKE. –

 Смежные вопросы

  • Нет связанных вопросов^_^