0

我知道这将是一个愚蠢的问题,但我仍然需要这样做。这是 java 应用程序中的一个基本程序,我想同时使用 3 个查询来打印表格。

(在这种情况下,我没有使用任何主键,所以请帮我解决这个问题,而不将我的属性作为主键 - 我知道这不是一个好习惯,但现在我需要完成它。)

我的代码:

    Connection con = null;        
    Statement stat1 = null, stat2 = null, stat3 = null;
    ResultSet rs1, rs2, rs3;
    stat1 = con.createStatement();
    stat2 = con.createStatement();
    stat3 = con.createStatement();

    String str = "\nProduct\tC.P\tS.P.\tStock\tExpenditure\tSales";
    info.setText(str);

    String s1 = "SELECT type, cp, sp, stock FROM ts_items GROUP BY type ORDER BY type";
    String s2 = "SELECT expenditure FROM ts_expenditure GROUP BY type ORDER BY type";
    String s3 = "SELECT sales FROM ts_sales GROUP BY type ORDER BY type";
    rs1 = stat1.executeQuery(s1);  
    rs2 = stat2.executeQuery(s2); 
    rs3 = stat3.executeQuery(s3); 

    String type;
    int cp, sp, stock, expenditure, sales;

   while( rs1.next() || rs2.next() || rs3.next() )
   {

       type = rs1.getString("type");
       cp = rs1.getInt("cp");
       sp = rs1.getInt("sp");
       stock = rs1.getInt("stock");

       expenditure = rs2.getInt("expenditure");

       sales = rs3.getInt("sales");

       info.append("\n" + type + "\t" + cp + "\t" + sp + "\t" + stock + "\t" + expenditure + "\t" + sales);


   }

输出:

Runtime Exception: Before start of result set 
4

4 回答 4

8

这就是问题:

while( rs1.next() || rs2.next() || rs3.next() )

如果rs1.next()返回true,rs2.next()并且rs3.next()不会因为短路而被调用。因此rs2rs3两者都将在第一行之前。如果rs1.next()返回 false,那么您无论如何都无法从中读取...

我怀疑你实际上想要:

while (rs1.next() && rs2.next() && rs3.next())

毕竟,您只想在所有三个结果集都有更多信息时继续前进,对吧?

老实说,目前尚不清楚您为什么不进行适当的加入。这对我来说更有意义......那么你就不会尝试在单个连接上使用多个结果集,也不会依赖type所有不同表中的完全相同的值。

于 2013-09-25T22:03:45.900 回答
1

你这样做,OR所以想象只有一个ResultSet有结果。

你最终得到的是试图从空的结果集中读取。

于 2013-09-25T22:04:13.677 回答
0

假设 rs1 有一个结果,而 rs3 有 3 个结果。现在根据您的代码,它将rs1.getString("type");在第二次迭代期间失败。最好分别循环遍历每个结果集。

于 2013-09-25T22:07:09.110 回答
0

type如果您的三个表之一缺少某个值,这将出现严重错误。您的代码只是假设您将从所有表中获取所有类型。您当前的数据集可能就是这种情况,但这意味着您的代码根本不健壮。

我强烈建议只使用一个 SQL 语句,将三个选择中的每一个都作为子选择,然后将它们全部连接在一起。你的 java 可以只迭代这个 SQL 语句的结果。

于 2013-09-25T22:10:14.537 回答