DVK*_*DVK 9 java sqlite exception jdbc resultset
我在SQLite的JDBC驱动程序中遇到问题.
我正在使用SELECT语句执行查询.
如果我得到一个空ResultSet(0行),那么我看到调用时抛出的"Closed ResultSet"异常getString(1).
如果没有先前的JDBC经验,我的理论(我无法通过JavaDocs确认ResultSet)就是这样
getString(1) 不适用于空(零行)结果集(按设计或由于错误)ResultSet'open"标志设置false为零行(再次,设计或错误)我看到了这个错误报告,但不确定它是否相关.
我的问题是:
ResultSet所有JDBC驱动程序中的泛型?对于#4,我的解决方案是在之后使用isFirst()call executeQuery()来检查结果集中是否有任何行.这是最佳做法吗?
(我也可以简单地选择一个计数insetad,因为我不需要一个结果集,只有零非零标志,但我想知道正确的事情,如果我关心选择的结果)
谢谢!
Bal*_*usC 17
是否清空,但执行以下操作始终有问题:
resultSet = statement.executeQuery(sql);
string = resultSet.getString(1); // Epic fail. The cursor isn't set yet.
Run Code Online (Sandbox Code Playgroud)
这不是一个错误.这是记录在案的行为.每个体面的JDBC教程都会提到它.next()在能够访问任何数据之前,您需要使用ResultSet的光标.
如果您真的对是否存在所谓的唯一行感兴趣,那么只需检查结果next().例如在一个虚构的UserDAO课堂上:
public boolean exist(String username, String password) throws SQLException {
boolean exist = false;
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id FROM user WHERE username = ? AND password = MD5(?)");
) {
statement.setString(1, username);
statement.setString(2, password);
try (ResultSet resultSet = statement.executeQuery()) {
exist = resultSet.next();
}
}
return exist;
}
Run Code Online (Sandbox Code Playgroud)
如果你真的希望只有零或一个行,那么就这样做:
public User find(String username, String password) throws SQLException {
User user = null;
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, username, email, birthdate FROM user WHERE username = ? AND password = MD5(?)");
) {
statement.setString(1, username);
statement.setString(2, password);
try (resultSet = statement.executeQuery()) {
if (resultSet.next()) {
user = new User(
resultSet.getLong("id"),
resultSet.getString("username"),
resultSet.getString("email"),
resultSet.getDate("birthdate"));
}
}
}
return user;
}
Run Code Online (Sandbox Code Playgroud)
然后在业务/域对象中相应地处理它,例如
User user = userDAO.find(username, password);
if (user != null) {
// Login?
}
else {
// Show error?
}
Run Code Online (Sandbox Code Playgroud)
如果你真的希望只有零或许多行,那么就这样做:
public List<User> list() throws SQLException {
List<User> users = new ArrayList<User>();
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, username, email, birthdate FROM user");
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
users.add(new User(
resultSet.getLong("id"),
resultSet.getString("username"),
resultSet.getString("email"),
resultSet.getDate("birthdate")));
}
}
return users;
}
Run Code Online (Sandbox Code Playgroud)
然后在业务/域对象中相应地处理它,例如
List<User> users = userDAO.list();
if (!users.isEmpty()) {
int count = users.size();
// ...
}
else {
// Help, no users?
}
Run Code Online (Sandbox Code Playgroud)