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

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

田成仁
2023-03-14
问题内容

我正在尝试为我的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中提取特定视频的路径,以发送给客户端。客户端上传视频,然后将其存储在文件系统中,并将其路径存储在DB本身中。

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


问题答案:

isBeforeFirst()返回true如果下一次调用next()会把光标的第一行ResultSet。换句话说,任何具有数据的成功查询一旦执行,将产生ResultSet带有isBeforeFirst()returning的true

只需从代码中删除该块,并让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 */


 类似资料:
  • 问题内容: 我表中有很多行,并且我在数据库上运行了相同的查询,即MySql,但是java ResultSet仅给出了表的第一行。这是我的代码。 问题答案: 如果要获取所有行,则应为: 在而当特定的条件为真语句连续执行语句块 注意:正如@BalusC所说,您的代码会引入SQL注入攻击,最好使用ptmt.set …而不是手动构造SQL String。

  • 上下文:我的数据库中有两个不同的表。第一个是actionblock(Java中的actionblock),第二个是location(Java中的PermanentLocation)。ActionBlock类需要一个位置才能工作,因此为了让代码工作,它首先加载ActionBlock数据,其中包含所需的位置,然后代码加载所需的位置。(是的,我知道下面的代码将垃圾邮件加载位置查询) 问题:使用与Acti

  • 通过下面的代码片段,我试图运行一个查询,该查询更新数据或将新数据插入名为的表中。该表包含一个名为和的列。如果中已经有一个节点,则更新中以毫秒为单位的时间。否则,将插入新的信息。 问题是,下面的代码片段无法将数据插入到数据库的表中。原因是声明: 那么应该如何编辑代码,以便更新重复值并插入新值呢?

  • 我和我的同事有一个bug,这是由于我们假设调用的空流将返回。 当然,这是我们假设而不阅读文档的错误。但我不理解的是,为什么空流的默认行为返回。这样做的理由是什么?与(相反返回false)一样,该操作以命令方式使用,脱离单子,可能用于语句。考虑到这些事实,是否有任何理由让空流上的默认为对于大多数用途是可取的?

  • 当我试图在工作区中使用文本文件创建BufferedReader时,“new BufferedReader语句”中的FileReader抛出一个filenotfoundexception。然而.exists()和.canRead()对于文件都返回true 这是代码 和输出 以及当我取消注释bufferedreader行时引发的异常 我发现了一个类似于这个的封闭线程,但在其中找不到任何明确的答案。

  • 你好,我有一个问题与elasticsearch php api,Elastica。 如果我运行这个: 我得到0个结果