【发布时间】:2012-01-18 18:40:20
【问题描述】:
我正在尝试使用准备好的语句查询我的数据库。最初,我有这个:
public ResultSet preparedQueryContactsWhereAccount(String accountName) throws SQLException {
PreparedStatement statment = null;
ResultSet rs = null;
String statString = "SELECT * FROM contacts WHERE account_name = ?";
try {
statment = mConn.prepareStatement(statString);
statment.setString(1, accountName);
rs = statment.executeQuery();
} catch(SQLException e) {
e.printStackTrace();
}
if(statment != null) {
statment.close();
}
return rs;
}
但是,这将返回一个封闭的 ResultSet。我做了一些阅读,发现有时当一个语句关闭时,它的 ResultSets 也可以关闭。所以我尝试了这个:
public MasterEntry preparedQueryContactsWhereAccount(String accountName, MasterEntry entry) throws SQLException, IllegalAccessException {
PreparedStatement prepStat = null;
ResultSet rs = null;
String statString = "SELECT * FROM contacts WHERE account_name = ?";
try {
prepStat = mConn.prepareStatement(statString);
prepStat.setString(1, accountName);
rs = prepStat.executeQuery();
} catch(Exception e) {
e.printStackTrace();
System.err.println("Statement failed.");
}
if(rs.isClosed()) {
System.out.println("fail");
throw new IllegalAccessException("closed");
}
else {
entry.setmFirstName(rs.getString("first_name"));
entry.setmLastName(rs.getString("last_name"));
entry.setmEmail(rs.getString("email_address"));
rs.close();
prepStat.close();
}
return entry;
}
只是稍微重新组织了流程,以便 ResultSet 数据都可以在方法内部处理。这会引发 IllegalAccessException,您可以在那里看到,ResultSet 已关闭。
我尝试以更简单的方式执行相同的查询(不安全且无法处理撇号等字符):
public ResultSet makeQuery(String query) {
ResultSet rs = null;
try {
rs = mStat.executeQuery(query);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Problem in query: " + query);
}
return rs;
}
查询等于"SELECT * FROM contacts WHERE account_name = '" + accountName + "'"
与我在preparedQuery 方法中使用的相同的accountName 字符串。这种方法可以正常工作,当然任何带有撇号的 accountName 都会失败。我真的很想用一个准备好的声明来做到这一点,但我就是想不通。有什么建议吗?非常感谢。
【问题讨论】:
标签: java sql jdbc prepared-statement resultset