我知道这是一个愚蠢的问题,但我仍然需要这样做。 这是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
答案 0 :(得分:8)
这是问题所在:
while( rs1.next() || rs2.next() || rs3.next() )
如果rs1.next()
返回true
,则由于短路而无法调用rs2.next()
和rs3.next()
。因此rs2
和rs3
都将位于第一行之前。如果rs1.next()
返回false,那么无论如何你都无法读取它......
我怀疑你真的想要:
while (rs1.next() && rs2.next() && rs3.next())
毕竟,你只想继续前进,而所有三个结果集都有更多信息,对吗?
说实话,目前尚不清楚为什么你没有做适当的加入。这对我来说更有意义......那么你不会尝试在单个连接上使用多个结果集,并且你不会依赖于所有的type
值完全相同不同的表格。
答案 1 :(得分:1)
你做OR
,所以想象只有一个ResultSet
有结果。
你最终得到的是尝试从空结果集中读取。
答案 2 :(得分:0)
假设rs1有一个结果而rs3有3个结果。现在根据您的代码,在第二次迭代期间rs1.getString("type");
将失败。
最好分别循环遍历每个resultSet。
答案 3 :(得分:0)
如果您的三个表之一中缺少type
值,则会出现严重错误。您的代码假设您将获得所有表中的所有类型。您当前的数据集可能就是这种情况,但这意味着您的代码根本不健全。
我强烈建议只使用一个SQL语句,将三个选择中的每一个作为子选择,然后将它们连接在一起。你的java只能迭代这一个SQL语句的结果。