gpt4 book ai didi

Java 和 SQL 准备语句错误(参数索引超出范围)

转载 作者:行者123 更新时间:2023-11-29 19:31:34 28 4
gpt4 key购买 nike

我一直在尝试修复抛出

的代码的一部分
java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).

我已经搜索了 stackoverflow 和互联网的其他部分,但找不到纠正错误的解决方案。

这是类文件的开头:

PreparedStatement stmt;

这是我的构造函数:

public DataAccessObjectImpl() throws Exception {
this.conn = new DBConnector();
}

这是导致问题的方法:

@Override
public boolean addAlbum(int UID, String artist, String album) {
String sql = "";

try {
stmt = conn.getConnection().prepareStatement("INSERT INTO music (identifier, UID, artist, album) VALUES (?,?,?,?);");
stmt.setString(1, getNewIdentifier());
stmt.setInt(2, UID);
stmt.setString(3, artist);
stmt.setString(4, album);
stmt.executeUpdate();
} catch (Exception ex) {
System.out.println("nugget 1 : " + ex);
} finally {
try {
if (stmt != null) {
stmt.close();
return true;
}
} catch (Exception e) {
System.out.println("Nugget 2 : " + e);
}
}
return false;
}

(“nugget”这个词对于我自己来说很容易在日志/控制台中找到)

从我在 stackoverflow 上收集到的信息来看,这可能是我的问号,这就是问题所在,但我似乎不知道如何解决。我将prepareStatement 用于在同一个类中运行良好的其他方法。

<小时/>

我在下面提供了一些工作代码,我想用preparestatement替换这些代码来修补SQL注入(inject):

try {
stmtb = conn.getConnection().createStatement();
sql = "INSERT INTO music VALUES ('" + getNewIdentifier() + "','" + UID + "','" + artist + "','" + album + "')";
} catch (SQLException ex) {
}
try {
stmt.executeUpdate(sql);
return true;
} catch (Exception e) {
System.out.println(e);
}
return false;

提前谢谢您!

<小时/>

通过更改此行修复:

stmt = conn.getConnection().prepareStatement("INSERT INTO music (identifier, UID, artist, album) VALUES (?,?,?,?);");

我把它改成这样:

PreparedStatement stmt = conn.getConnection().prepareStatement("SELECT * FROM user WHERE username = (?);");

并删除了这一行:

PreparedStatement stmt;

感谢卡亚曼的帮助!

最佳答案

由于查询是正确的,但发生了异常,唯一可能的解释是 stmt 以某种方式损坏。唯一现实的情况是在多线程环境中,多个线程使用相同的 stmt 来执行查询。

由于您使用 prepareStatement() 创建新的 PreparedStatement 对象,因此没有理由共享“全局”引用。在大多数情况下,最佳实践是在尽可能小的范围内定义和使用变量。

因此,从外部作用域中删除 stmt 变量,而只写入

PreparedStatement stmt = conn.getConnection().prepareStatement(query);

无论您需要什么地方。

关于Java 和 SQL 准备语句错误(参数索引超出范围),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41745572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com