是否有一种简单的方法可以检查我是否应该使用executeUpdate
或executeQuery
。
当然,我这样做,但它有点混乱
try
{
Statement st = conn.createStatement();
try
{
ResultSet rs = st.executeQuery(query.query);
//parse result
}
catch (SQLException e)
{
if(Messages.getString("Statement.57").equals(e.getMessage()))
{
final int rowsAffected = st.executeUpdate(query.query);
}
else
{
throw e;
}
}
}
catch (final SQLException e)
{
//error handling
}
答案 0 :(得分:1)
如果您事先不知道正在执行的查询类型,则应使用execute
代替executeUpdate
或executeQuery
。确保正确解释布尔返回值的含义:true
表示(第一个)结果是ResultSet
,false
表示(第一个)结果是更新计数。在某些数据库系统上,您可以将多个结果集与更新计数交错。你通常可以忽略忽略这种区别。
所以使用:
boolean isResultSet = statement.execute(aDynamicStatement);
if (isResultSet) {
try (ResultSet rs = rs.getResultSet()) {
// Process result set
}
} else {
int updateCount = statement.getUpdateCount();
// do something with update count
}
如果您想要或需要处理多个结果(通常仅用于存储过程,并且仅在支持此过程的系统上),您需要将其修改为:
boolean isResultSet = statement.execute(aDynamicStatement);
while (true) {
if (isResultSet) {
try (ResultSet rs = rs.getResultSet()) {
// Process result set
}
} else {
int updateCount = statement.getUpdateCount();
if (updateCount == -1) {
// No more results, exit while loop
break;
}
// do something with update count
}
isResultSet = statement.getMoreResults();
}
另见apidoc:
答案 1 :(得分:0)
首先,你不应该给自己这个问题。您应该设计包装器API,以便提供对executeQuery()
和executeUpdate()
方法的单独访问。呼叫者将知道他需要哪些:不要通过使你的API太窄来丢失这些信息。