SQLException:executeQuery 方法不能用于更新

Posted

技术标签:

【中文标题】SQLException:executeQuery 方法不能用于更新【英文标题】:SQLException: executeQuery method can not be used for update 【发布时间】:2013-04-07 01:50:35 【问题描述】:

我正在尝试使用 java servlet 类将从注册表中获取的用户信息插入 Derby DB。

在用户单击提交按钮并填写了用户信息后,我立即连接到 NetBeans 上的数据库。然后它应该运行这个方法:

public void insertNewUser(String userName, String passWord, String lastName, String firstName, String age, char sex, String email) 
    try 
        stmt = conn.createStatement();
        String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES ('" + userName + "', '" + passWord + "', '" + lastName + "', '" + firstName + "', " + age + ", '" + sex + "', '" + email + "')";
        System.out.println(insertNewUserSQL);
        stmt.executeQuery(insertNewUserSQL);
        stmt.close();
     catch(SQLException sqlExcept) 
        sqlExcept.printStackTrace();
    

但我不断收到以下异常:

java.sql.SQLException: executeQuery method can not be used for update.

这到底是什么意思?

SQL 命令是正确的,因为我可以在 NetBeans SQL 命令窗口中手动执行它。

对 servlet 或我不了解的东西有限制吗?

提前致谢!

【问题讨论】:

【参考方案1】:

由于您要插入记录,因此您应该使用executeUpdate() 而不是executeQuery()

以下是一些经常被误用的方法:


布尔执行()

执行此 PreparedStatement 对象中的 SQL 语句,这可能 可以是任何类型的 SQL 语句。

结果集executeQuery()

在此 PreparedStatement 对象中执行 SQL 查询并返回 查询生成的 ResultSet 对象。

int executeUpdate()

执行此 PreparedStatement 对象中的 SQL 语句,它 必须是 SQL INSERT、UPDATE 或 DELETE 语句;或 SQL 语句 不返回任何内容,例如 DDL 语句。


还有一点,您的查询很弱,因为它很容易受到SQL Injection 的攻击。请使用PreparedStatement进行参数化。

示例代码片段:

String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES (?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(insertNewUserSQL);
pstmt.setString(1, userName);
// ... repeat this step until the last parameter ....
pstmt.setString(7, email);
pstmt.executeUpdate();
Java PreparedStatement

【讨论】:

谢谢你,J W!像魅力一样工作! J W,非常感谢。这对像我这样的菜鸟很有帮助。我会确保我使用 PreparedStatements!再次感谢!【参考方案2】:

要更新值,您需要使用可更新的 ResultSet,如下所示:

ResultSet res = preparedStatement.executeQuery(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
res.first();
res.updateInt("id", 2);
res.updateRow();

也可以使用语句的executeUpdate方法,如下: statement.executeUpdate("update table set id = 2");

【讨论】:

以上是关于SQLException:executeQuery 方法不能用于更新的主要内容,如果未能解决你的问题,请参考以下文章

SQLException:“无法使用 executeQuery() 发出数据操作语句”[重复]

无法使用 executeQuery 发出数据操作语句

SQLException: 游标状态无效

java.sql.SQLException:调用中的参数无效:getBytes()

ResultSet 关闭后不允许出现 ResultSet、空指针异常和 SQLException 操作

java.sql.SQLException:SQL 字符串不是 glassfish 服务器中的查询