Я пытаюсь запросить мою базу данных, используя подготовленное утверждение. Изначально у меня было это:
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 + "'"
Строка accountName String, которую я использовал в методе prepareQuery. Этот способ работает нормально, за исключением, конечно, любой accountName с апострофом в нем не удастся. Я действительно хотел бы сделать это с готовым заявлением, но я просто не могу понять это. Любой совет? Большое спасибо.