当使用DELETE sql查询时,java.sql.Statement.executeQuery(字符串sql)抛出SQLException

当使用DELETE sql查询时,java.sql.Statement.executeQuery(字符串sql)抛出SQLException,java,sql,database,oracle,eclipse-rcp,Java,Sql,Database,Oracle,Eclipse Rcp,我知道要执行SQLDELETE语句,我需要使用executeUpdate。但是,我需要只支持SELECT语句,因此我使用的是executeQueryString sql。 我的数据库是Oracle 我的问题是,我在基于桌面的应用程序中使用java.sql.Statement.executeQueryString sql,我们应用程序中的文本框接受任何类型的查询,在测试时,我们发现executeQuerysql实际上正在执行删除查询,即它正在成功删除记录,然后抛出错误-SQLException a

我知道要执行SQLDELETE语句,我需要使用executeUpdate。但是,我需要只支持SELECT语句,因此我使用的是executeQueryString sql。 我的数据库是Oracle

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

api不应该允许执行删除查询吗?。 如何防止Statement.executeQuery api执行删除查询?
您需要通过executeQuery方法明确管理不执行插入、更新和删除查询。这符合JDBC规范,因此它也将接受删除查询并抛出异常

executeQuery() is used for SELECT sql operation
executeUpdate() is used for INSERT, UPDATE and DELETE sql operation.
您的查询用于删除操作,因此请使用stmt.executeUpdate


正如您所提到的,您是从一个textbox表单用户那里获得这个消息的,您可以在执行查询字符串之前在查询字符串本身上添加验证

假设您以字符串形式获取查询,您可以检查字符串是否以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 
}
要防止在删除执行中使用executeQuery,请在代码中使用返回类型。 i、 e.如果存在和DML,则返回类型应始终为int-

int i=stmt.executeUpdate('');

如果使用int i=stmt.executeQuery;-它会给您带来编译时错误,并阻止您使用executeQuery

abhijeet,我知道executeUpdate需要用于删除sql操作,我的问题是我正在使用executeQuery,因为我打算只支持SELECT操作。然而,我们应用程序中的文本框接受任何类型的查询,当使用DELETE时,executeQuery只会成功执行它,然后抛出异常。你现在收到我的问题了吗?正如你提到的,你是从一个文本框表单用户那里收到这个问题的,你可以在执行之前在查询字符串本身上添加验证。假设您以字符串形式获取查询,您可以检查字符串是否以SELECT开头,然后仅执行。我们的文本框是一个多行自由文本框,可以接受任何内容。您可以发布文本框的代码吗。您是如何读取textbox的值的?我们的textbox是一个可以接受任何内容的多行免费textbox,验证我的textbox是我最不想做的事情。但是api“executeQuerysql”返回一个“ResultSet”,这意味着它应该只接受SELECT。因为executeQuerysql执行查询,当我们检查resultSet.getMetaData抛出SQLExceptionAshish时,stmt.executeQuery不返回int值,它返回一个resultSet对象:我的观点是,只有stmt.executeQuery才会返回resultSet对象,当您尝试返回int时,它会给您一个编译时错误,。这就是我在代码中提到的。也许您可以更改db特权,以从您通过jdbc连接的db用户处撤销除select priv之外的所有特权。这可能吗?i、 你是否有一个特定的db用户不是这些对象的所有者?还有你得到了什么SQLexception?我很好奇,因为我无法想象删除成功了,但无论如何抛出了异常。我们的文本框是一个多行免费文本框,可以接受任何内容,验证我的文本框是我最不想做的事情。但是api“executeQuerysql”返回一个“ResultSet”,这意味着它应该只接受SELECT。因为executeQuerysql执行查询,当我们执行此检查时,resultSet.getMetaData抛出SQLExceptionMina,所以我尝试使用setReadOnlytrue;关于连接对象:docs.oracle.com/javase/6/docs/api/java/sql/…然而,问题仍然存在。我只是建议您从数据库站点管理这些priv,而不是在textbox上进行验证。就像前端客户端作为某个数据库用户连接到数据库,并从该用户处撤销dml权限一样。