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

时间:2014-10-12 11:23:59

标签: 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服务的一部分,该服务从DB中提取特定视频的路径,以发送到客户端。视频由客户端上传,然后存储在文件系统中,其路径存储在数据库本身中。

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

2 个答案:

答案 0 :(得分:6)

如果下一次调用true将光标放在next()的第一行,

isBeforeFirst()会返回ResultSet。换句话说,任何包含数据的成功查询,一旦执行,将产生ResultSetisBeforeFirst()返回true

只需从代码中移除该块,并让rs.next()循环处理可能为空的ResultSet

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 */

答案 1 :(得分:0)

使用if(!rs.isBeforeFirst())代替if(rs.isBeforeFirst())。您的问题将得到解决。