当前位置: 首页 > 面试题库 >

JDBC驱动程序在空的ResultSet上引发“ ResultSet Closed”异常

慕承允
2023-03-14
问题内容

我在用于SQLite的JDBC驱动程序中有问题。

我正在用SELECT语句执行查询。

如果我得到一个空ResultSet(0行),则在调用时会抛出“ Closed ResultSet”异常getString(1)

没有大量的JDBC经验,我的理论(我无法通过JavaDocs确认ResultSet)是

  • getString(1) 对空(零行)结果集不起作用(通过设计或由于错误)
  • ResultSet的“打开”标志设置false为零行(同样是设计或错误)

我看到了此错误报告,但不确定是否相关。

我的要求是:

  1. 以上理论正确吗?
  2. 是虫子吗?特征?(如果是这样,有人可以指向文档吗?)
  3. 它是特定于SQLIte的JDBC还是ResultSet所有JDBC驱动程序中的泛型?
  4. 做这样的事情的正确方法是什么?

对于#4,我的解决方案是立即使用isFirst()call executeQuery()来检查结果集中是否有任何行。这是最佳做法吗?

(我也可以只选择一个insetad计数,因为我真的不需要结果集,只需要零-非零标志,但是如果我确实关心select的结果,我想知道正确的做法)

谢谢!


问题答案:

是否为空,但执行以下操作始终会 出错

resultSet = statement.executeQuery(sql);
string = resultSet.getString(1); // Epic fail. The cursor isn't set yet.

这不是错误。这是记录的行为。每个不错的JDBC教程都提到了它。您需要先使用设置ResultSet的游标,next()然后才能访问任何数据。

如果您实际上对所谓的唯一行是否 存在 感兴趣,则只需检查的结果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;
}

如果你真的希望只有 一个 行,那么就这样做:

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;
}

然后只需在业务/域对象中相应地处理它,例如

User user = userDAO.find(username, password);

if (user != null) {
    // Login?
}
else {
    // Show error?
}

如果你真的希望只有 许多 行,那么就这样做:

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;
}

然后只需在业务/域对象中相应地处理它,例如

List<User> users = userDAO.list();

if (!users.isEmpty()) {
    int count = users.size();
    // ...
}
else {
    // Help, no users?
}


 类似资料:
  • 编辑4:我设法找出了有问题的依赖关系。在这里: 通过移除此依赖项,TestCase将正确执行并打印出所有可用的字符集。然而,我们确实需要一个数据库驱动程序为我们的应用程序。有人知道sybase jdbc驱动程序出了什么问题吗?

  • 问题内容: 我正在使用加载。 我使用MySQL作为数据源,并且已在ODBC数据源管理器(在Windows 8中)中添加了数据源名称。 这是代码: 输出: 问题答案: 您正在使用Java 8吗?该类不再存在(更多信息)。如果需要使用Java 7,可以安装它。

  • 源代码: 编辑:我的问题是我的MySQL服务器没有监听那个端口,因为当我用phpMyAdmin测试它时,我忘记它运行在同一台机器上。

  • 在java for Edge browser中运行以下测试时,它引发异常。但是chrome浏览器的测试运行成功了,有人能给出关于这个问题的建议吗? java.lang.NullPointerException在Payment.Tests.BaseTest.BeforeMethod(baseTest.java:33)在Sun.Reflect.NativeMethodAccessorImpl.Invo

  • 我正在尝试将Java程序连接到远程Oracle数据库。在网上做了一些研究之后,我决定最简单的方法是使用Oracle JDBC驱动程序。我下载并运行了jar文件,得到了消息“****JCE UNLIMITED STRENGTH已安装*****”问题是,当我尝试将驱动程序添加到我的类路径(javac-classpath ojdbc8.jar Connect.java)时,我不断收到一条错误消息,说“包

  • 我有selenium 2.53.1.jar、platform Windows、Java-1.8、chrome=52.0、chrome-driver.exe-2.23。 在Jenkins上进行夜间观察测试时,我看到了以下消息。 org.openqa.selenium.WebDriverException:未知错误:无法发现打开的页面(驱动信息:chromeDrive=2.23.409699 (49b