![](/img/trans.png)
[英]MS Access delete query in Java throws a java.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。
您将需要通过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.