2009-07-09 6 views
1

La méthode suivante, lorsqu'elle est appelée avec quelque chose comme String val = getCell("SELECT col FROM table WHERE LIKE(other_col,'?')", new String[]{"value"}); (SQLite), génère un java.lang.ArrayIndexOutOfBoundsException: 0 at org.sqlite.PrepStmt.batch(PrepStmt.java:131). Quelqu'un peut-il prendre pitié de ma pauvre maladresse ici et m'aider avec pourquoi?Pourquoi Java PreparedStatement lance-t-il ArrayIndexOutOfBoundsException 0 avec parameterIndex = 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; 
} 

Le setString() serait, dans ce cas, être ps.setString(1, "value") et ne devrait pas être un problème. Évidemment, je me trompe bien.

Merci beaucoup à l'avance.

Répondre

4

Perdez les guillemets autour du point d'interrogation. Ce devrait être LIKE(other_col,?). L'instruction préparée va comprendre que vous avez une chaîne et ajouter les guillemets lui-même.

(Est-ce vraiment SQLite faire LIKE en fonction LIKE(x,y) plutôt qu'un opérateur x LIKE y?)

+0

Je pense que SQLite fait les deux ... x COMME y équivaut à appeler la fonction scalaire LIKE (x, y) , ce qui vous permet de redéfinir le fonctionnement de l'opérateur en redéfinissant la fonction ... – Stobor

+2

Quelle utilisation haineuse de l'indice supérieur était :-) – paxdiablo

+0

Merci! Si simple. Et je pense que j'utilisais encore LIKE (x, y) parce que j'avais remplacé une autre fonction; SQLite a l'opérateur LIKE. –

Questions connexes