繁体   English   中英

使用DELETE sql查询时,java.sql.Statement.executeQuery(String sql)引发SQLException

[英]java.sql.Statement.executeQuery(String sql) throws SQLException when DELETE sql query is used

我知道要执行sql DELETE语句,我需要使用executeUpdate()。 但是我只需要支持SELECT语句,因此我正在使用executeQuery(String sql)。 我的数据库是Oracle。

我的问题是,我在基于桌面的应用程序中使用java.sql.Statement.executeQuery(String sql),我们应用程序中的文本框接受任何类型的查询,并且在测试时我们发现executeQuery(sql)实际上正在执行DELETE查询,即它成功删除了一条记录,然后抛出错误-SQLException。

  1. API是否不应该允许执行DELETE查询?
  2. 如何阻止Statement.executeQuery api执行DELETE查询?

您将需要通过executeQuery()方法显式管理不执行INSERT,UPDATE和DELETE查询。 这是按照JDBC规范进行的,因此它也将接受删除查询并抛出异常。

executeQuery() is used for SELECT sql operation
executeUpdate() is used for INSERT, UPDATE and DELETE sql operation.

您的查询是针对DELETE操作的,因此请使用stmt.executeUpdate();

正如您提到的那样,您是从文本框表单用户那里获得的,您可以在执行查询之前在查询字符串本身上添加验证。

假设您在String中获得查询,则可以检查string是否以SELECT开头,然后仅执行。

if (StringUtils.startsWithIgnoreCaseAndWs(sql, "INSERT") 
                    || StringUtils.startsWithIgnoreCaseAndWs(sql, "UPDATE") 
                    || StringUtils.startsWithIgnoreCaseAndWs(sql, "DELETE") 
                    || StringUtils.startsWithIgnoreCaseAndWs(sql, "DROP") 
                    || StringUtils.startsWithIgnoreCaseAndWs(sql, "CREATE") 
                    || StringUtils.startsWithIgnoreCaseAndWs(sql, "ALTER")
                    || StringUtils.startsWithIgnoreCaseAndWs(sql, "TRUNCATE")) { 

                    // Return message Unable to execute any update or modification queries through executeQuery()
        } else {
        //Execute Query 
}

为了防止在delete执行中使用executeQuery ,请在代码中使用返回类型。 即,如果存在DML,则返回类型应始终为int。

int i=stmt.executeUpdate('');

如果您使用int i=stmt.executeQuery(''); -- it will gives you compile time error int i=stmt.executeQuery(''); -- it will gives you compile time error并阻止您使用executeQuery

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM