ResultSet getFetchSize()似乎不起作用?

时间:2013-01-11 10:33:51

标签: java sql jdbc

我遇到getFetchSize()函数问题。

我只需要知道SQL查询是否返回零行。

我尝试过这个简单的陈述:

if (rs.getFetchSize()==0)
    System.out.println("HEADLINE");

其中rs属于ResultSet类型。上面的代码似乎不起作用。它始终打印消息rs是否为空。

我检查了SQL查询本身,当行存在时,它正确返回非空结果。

有关如何确定查询是否返回0行的任何想法? 我用Google搜索,找不到任何答案。

6 个答案:

答案 0 :(得分:21)

ResultSet.getFetchSize()不会返回结果数量!来自here

  

标准JDBC还允许您指定提取的行数   每个数据库往返查询,并引用此数字   作为获取大小

您可以遍历结果集,如果您没有任何条目,则可以确定没有结果。为什么不能立即获得结果大小?因为数据库正在返回指向其结果的指针,并且它依赖于您迭代它(返回到每行的服务器)。

答案 1 :(得分:4)

获取大小是每次往返应从数据库中检索的行数。它与返回的行数无关。

你应该做的是调用rs.next() - 如果你的查询没有返回任何行,它将返回false。

答案 2 :(得分:3)

实际上,我认为另一种方法可以做到这一点:

Class.forName("org.exempleDatabase.Driver");
Connection  conn = DriverManager.getConnection("jdbc:exempleDatabase:/../smartytwiti", "username", "password");
ResultSet resset = conn.createStatement().executeQuery("select count(*) from yourTable;");
resset.last();
int resnum = resset.getRow();
if(resnum<1)System.out.println("HEADLINE");

这将采用ResultSet,移动到该集的最后一行,然后在 resnum 中给出该行的编号。如果您要使用 resset.next()迭代结果,请记住使用 resset.beforeFirst() 返回

希望有所帮助。

答案 3 :(得分:1)

在SQL Server上您可以将其放入sql查询:

COUNT(*) OVER(PARTITION BY 1)

喜欢这里:

select COUNT(*) OVER(PARTITION BY 1) as NUM,ident as ID,employee as EMP from invoice where date between '2017-01-01 00:00:00.000' and '2017-01-31 00:00:00.000'

然后,你得到这样的结果:

NUM, ID,    EMP
4,   28912, JOHN
4,   28913, JOHN
4,   28914, ADAM
4,   28915, PETER

现在,在处理所有数据之前,您只能读取第一个col和第一个单元格以获取记录数。用于存储结果的对象数组[发票]仅被声明一次,同时获得口渴结果。

Object[][] invoices = null;
Boolean b_inv = false;
[...]
try {
        Statement stmt = db_conn.createStatement();
        boolean results = stmt.execute(sql_query);

        if (results) {
            try (ResultSet rs1 = stmt.getResultSet()) {
                Integer l = 0;

                while (rs1.next()) {
                    if (!b_inv) {
                        invoices = new Object[rs1.getInt(1)][2];
                        b_inv = true;
                    }
                    invoices[l][0] = rs1.getInt(1);
                    invoices[l][1] = rs1.getString(2);
                    l++;
                }
            }
            stmt.close();
        }
    } catch (SQLException | NumberFormatException dbsi1) {}

在SQL Server端对记录进行计数是不是很好?

答案 4 :(得分:0)

您可以使用此代码执行您要查找的内容:

        Class.forName("org.exempleDatabase.Driver");

        Connection  conn = DriverManager.getConnection("jdbc:exempleDatabase:/../smartytwiti", "username", "password");

        ResultSet resset = conn.createStatement().executeQuery("select count(*) from yourTable;");

        resset.next();//set the pointer to the first row(important!)

        if(resset.getInt(1)==0)
            System.out.println("HEADLINE");

答案 5 :(得分:0)

如前所述,getFetchSize不能获取结果数。

您可以执行以下操作。 初始化整数并递增。.

 int count = 0
 while(rs.next()) {
    count++;
 }