2009-07-09 17 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に投げているのはなぜですか?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; 
} 

setString()が、この場合には、ps.setString(1, "value")だろうと問題になることはありません。明らかに私は間違っています。

事前に感謝します。

答えて

4

疑問符の前後に引用符をなくしてください。それはLIKE(other_col,?)である必要があります。準備されたステートメントは、文字列があり、引用符自体を追加していることがわかります。

+0

私はSqliteを、両方んだと思う... Y LIKE xは呼び出すことと同等であるスカラー関数LIKE(x、y)は(んSQLiteは本当に機能LIKE(x,y)ではなく、オペレータx LIKE y?としてLIKEを行います)関数を再定義することによって演算子がどのように動作するかを再定義することができます。 – Stobor

+2

上付き文字の凶悪な使用:-) – paxdiablo

+0

ありがとうございます!とても簡単。私は他の関数を置き換えたので、私はまだLIKE(x、y)を使っていたと思います。 SQLiteにはLIKE演算子があります。 –

関連する問題