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")
だろうと問題になることはありません。明らかに私は間違っています。
事前に感謝します。
私はSqliteを、両方んだと思う... Y LIKE xは呼び出すことと同等であるスカラー関数LIKE(x、y)は(んSQLiteは本当に機能
LIKE(x,y)
ではなく、オペレータx LIKE y
?としてLIKE
を行います)関数を再定義することによって演算子がどのように動作するかを再定義することができます。 – Stobor上付き文字の凶悪な使用:-) – paxdiablo
ありがとうございます!とても簡単。私は他の関数を置き換えたので、私はまだLIKE(x、y)を使っていたと思います。 SQLiteにはLIKE演算子があります。 –