微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

经过多次尝试后,我将查询切换为一个简单的SELECT * FROM VIDEOS,看看问题是我输入的数据与我在查询中使用的数据之间是否存在差异,但即使这个简单的查询选择表格中的所有项目也没有t返回任何结果.

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

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中提取特定视频的路径,以发送到客户端.视频由客户端上传,然后存储在文件系统中,其路径存储在DB本身中.

一旦我看到DB工作,我将用SELECT * FROM VIDEOS WHERE PHONENUM =’%s’和DATETIME =’%s’“替换SELECT * FROM VIDEOS,phonenum,timeStamp,以便查询提取我需要的确切项目.

解决方法:

如果下一次调用next()将光标放在ResultSet的第一行,则isBeforeFirst()返回true.换句话说,任何具有数据的成功查询一旦执行,将生成一个带有isBeforeFirst()的ResultSet返回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 */

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐