java - JDBC 返回一个空的 ResultSet (rs.isBeforeFirst() == true) 尽管表不为空

标签 java sql database sqlite jdbc

我正在尝试为我的 Web 服务完成数据库访问方法。服务和数据库访问方法适用于数据库中的所有其他表,但这个特定方法却不行。当我查询数据库时,ResultSet 总是返回空(意思是 isBeforeFirst() == true)。

经过多次尝试,我将查询简化为一个简单的 SELECT * FROM VIDEOS 以查看问题是否出在我输入的数据和我在查询中使用的数据之间,但即使是这样简单的选择表中所有项目的查询未返回任何结果。

这是我用来从数据库中提取信息的方法:

public static Object[] getVideo(String phonenum, String timeStamp)
{
    Connection c = null;
    Statement stmt = null;
    Object[] result = null;
    try
    {
        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:lineappDB.db");
        c.setAutoCommit(false);
        System.out.println("Opened database successfully");
        stmt = c.createStatement();
        String query = String.format("SELECT * FROM VIDEOS");
        ResultSet rs = stmt.executeQuery(query);

        // If no data was found
        if (rs.isBeforeFirst())
        {
            rs.close();
            stmt.close();
            c.close();
            return null;
        } else
        {
            result = new Object[6];
            while (rs.next())
            {
                result[0] = rs.getInt(1);
                result[1] = rs.getString(2);
                result[2] = rs.getString(3);
                result[3] = rs.getString(4);
                result[4] = rs.getString(5);
                result[5] = rs.getInt(6);
            }
        }
        rs.close();
        stmt.close();
        c.close();
    } catch (Exception e)
    {
        try
        {
            if (!c.isClosed())
            {
                c.commit();
                c.close();
            }
        } catch (Exception ex)
        {
            System.err.println(ex.getClass().getName() + ": " + ex.getMessage());
            return null;
        }
        System.err.println(e.getClass().getName() + ": " + e.getMessage());
        return null;
    }
    System.out.println(String.format("Succesfully pulled from DB - %s %s", result[1], result[2]));
    return result;
}

任何帮助将不胜感激。

澄清编辑: 该方法是 Web 服务的一部分,该服务从数据库中提取特定视频的路径,并将其发送到客户端。视频由客户端上传,然后存储在文件系统中,它们的路径存储在数据库本身中。

一旦我看到数据库正常工作,我就会将 SELECT * FROM VIDEOS 替换为 SELECT * FROM VIDEOS WHERE PHONENUM = '%s' AND DATETIME = '%s'", phonenum, timeStamp 以便查询提取我需要的确切项目。

最佳答案

isBeforeFirst()如果下一次调用 next() 会将光标放在 ResultSet 的第一行,则返回 true。换句话说,任何成功的包含数据的查询一旦执行,将生成一个 ResultSet,其中 isBeforeFirst() 返回 true

只需从您的代码中删除该 block ,然后让 rs.next() 循环处理可能为空的 ResultSets:

try
{
    Class.forName("org.sqlite.JDBC");
    c = DriverManager.getConnection("jdbc:sqlite:lineappDB.db");
    c.setAutoCommit(false);
    System.out.println("Opened database successfully");
    stmt = c.createStatement();
    String query = String.format("SELECT * FROM VIDEOS");

    result = new Object[6];
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next())
    {
        result[0] = rs.getInt(1);
        result[1] = rs.getString(2);
        result[2] = rs.getString(3);
        result[3] = rs.getString(4);
        result[4] = rs.getString(5);
        result[5] = rs.getInt(6);
    }
} 
/* catch and finally snipped for clarity of the answer */

关于java - JDBC 返回一个空的 ResultSet (rs.isBeforeFirst() == true) 尽管表不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26324603/

相关文章:

java - 如何在 servlet 中处理多个文档打开请求

java - 如何使用java读取某个URL的xml文件?

java - 如何对 JFrame 中的两个组件进行排序才能实现透明度和 ActionListener 正常工作?

mysql - 如何在 MySQL 中临时禁用外键约束?

python - 请求中的条件

sql - 如何为每一行编写一个在日期时间加入的 SQL 查询

php - 我的 MySQL 函数在乘以小数时完全失去了数学精度。这是为什么?

java - ModelAndView 的 .getJSON 404 错误

php - 惯用查询获取今天的记录

python - 带有适用于 Ubuntu 的 Python 客户端和 Gui 工具的免费 RDMBS