SQL-Java:Prepared语句给出索引超出范围错误

时间:2018-11-22 12:17:13

标签: java sql

我有以下代码:

try {
        userPasswordNew = new String(ChangePW.passwordFieldconfirm.getPassword());
        PreparedStatement prepStmt = connection.prepareStatement(
        "UPDATE " + TABLE_NAME + " SET password = " + userPasswordNew + " WHERE username = " + username);
        prepStmt.setString(2, BCrypt.hashpw(userPasswordNew, BCrypt.gensalt(bcryptRounds))); //2 represents number of column in database starting with 0
        System.out.println(prepStmt);
        return prepStmt.executeUpdate() != 0;
    } catch (SQLException e) {
        e.printStackTrace();        
}

我尝试将1 2和3作为索引,但是每次它抛出Index out of range异常。还有另一种获取列的方法,也许加上它的名字吗?还是我做错了什么? 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

要使用准备好的语句-请使用?代替提供的值。像此示例中一样:

String updateString =
    "update " + dbName + ".COFFEES " +
    "set SALES = ? where COF_NAME = ?";
updateSales = con.prepareStatement(updateString);

要获取更多信息,请查看here。在您的情况下,可能是:

PreparedStatement prepStmt = connection.prepareStatement(
    "UPDATE " + TABLE_NAME + " SET password = ? WHERE username = ?");
prepStmt.setString(1, "that new password");
prepStmt.setString(2, "user_name");

答案 1 :(得分:0)

我假设passwordusername是文本值。因此,您必须将这些值用引号引起来。

那将是查询

"UPDATE " + TABLE_NAME + " SET password = " + userPasswordNew + " WHERE username = " + username

此外,在使用PreparedStatement时,一定不要在查询中提及变量。更整洁的方法是改用?。像这样的东西。

"UPDATE " + TABLE_NAME + " SET password = ? WHERE username = ?

然后对userPasswordNewusername使用.setString()等方法。

请选中https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

答案 2 :(得分:0)

使用PreparedStatement时,通过放置1个或多个?来定义要在sql语句中传递的参数。
然后,您可以使用setString()setInt(),...之类的方法将值传递给这些参数。
参数的顺序不是基于0而是基于1。

    try {
        userPasswordNew = new String(ChangePW.passwordFieldconfirm.getPassword());
        PreparedStatement prepStmt =
                connection.prepareStatement("UPDATE " + TABLE_NAME +" SET password = ? WHERE username = ?");

        prepStmt.setString(1, userPasswordNew);
        prepStmt.setString(2, username);
        System.out.println(prepStmt);
        return prepStmt.executeUpdate() != 0;
    } catch (SQLException e) {
        e.printStackTrace();
    }

您的代码中有以下行:

prepStmt.setString(2, BCrypt.hashpw(userPasswordNew, BCrypt.gensalt(bcryptRounds)));

我不知道这是否是您要传递的参数。
如果是,我在sql语句中看不到?占位符。