【问题标题】:.next() is not working in ResultSet in Java [duplicate].next() 在 Java 的 ResultSet 中不起作用 [重复]
【发布时间】:2020-10-18 09:43:55
【问题描述】:

.next() 在此代码中不起作用。我尝试了很多但徒劳无功。例如,如果我在 branch_issuance_g_item_vise(数据库表名)中有 10 行。此代码仅打印第一行 10 次。

void stockIssuance(String date) throws SQLException{
    report_table.setVisible(true);
    
    Statement s = db.conn().createStatement();
    ResultSet rs = s.executeQuery("SELECT * FROM branch_issuance_g_item_vise");
    
    DefaultTableModel dt = (DefaultTableModel) report_table.getModel();
    dt.setRowCount(0);
    
    Vector v = new Vector();
    if(!rs.next()){
        m.printError("No Data Found");
        rs.beforeFirst();
    }
    else{
        while(rs.next()){
            v.add(rs.getString("item_name"));
            v.add(rs.getString("qty"));

            dt.addRow(v);
        }
    }
}

即使,这也行不通。

void stockIssuance(String date) throws SQLException{
    report_table.setVisible(true);
    
    Statement s = db.conn().createStatement();
    ResultSet rs = s.executeQuery("SELECT * FROM branch_issuance_g_item_vise");
    
    DefaultTableModel dt = (DefaultTableModel) report_table.getModel();
    dt.setRowCount(0);
    
    Vector v = new Vector();
    while(rs.next()){
        v.add(rs.getString("item_name"));
        v.add(rs.getString("qty"));

        dt.addRow(v);
    }
}

【问题讨论】:

  • 尝试删除if(!rs.next())。只需保留 while 循环即可。
  • 我试过了,结果一样。
  • if 的逻辑会导致它跳过一行。你继续使用相同的向量。所以你实际上是在更新它以前的所有实例。你必须在每次迭代中使用一个新的向量。
  • 第二个代码块是您应该使用的,但您需要将Vector v = new Vector(); 语句移入 while 循环,因此每次调用addRow() 都会添加不同的矢量对象。与上面duplicate link 中的描述相同。
  • @RealSkeptic 非常感谢兄弟。你能解释一下,为什么每次迭代都需要创建一个新的向量对象吗?

标签: java database netbeans resultset


【解决方案1】:

您应该在 while 循环的开始处创建一个新向量 v。照原样,行将附加到向量中,但您只有两列。

此外,每次调用 rs.next 时,结果集都会前进一步。最简单的解决方法是删除结果集是否为空的检查。

【讨论】:

  • 不清楚。使用新的向量。清除它只会产生相同的效果,但最终会得到更短的向量。
  • 清除向量与代码当前正在执行的操作同样错误
  • 相同的代码在我的其他项目中运行良好。但我不知道,有什么问题。
  • 更新了答案。你完全正确,需要一个新的向量。
【解决方案2】:

while之前添加rs.beforeFirst,并在循环内移动Vector ArrayList创建

else {
    rs.beforeFirst();
    while(rs.next()) {
       ArrayList v = new ArrayList();

将光标移动到此 ResultSet 对象的前面,就在第一行之前。如果结果集不包含行,则此方法无效。

你应该使用 ArrayList 而不是 Vector

【讨论】:

  • 这不是主要问题。它只是跳过一行。真正的问题是重用向量。
  • @RealSkeptic 真实,已更新
【解决方案3】:

首先,您应该在 else 条件之前调用 res.beforeFirst(),因为每次 if 语句检查条件时,您正在执行 rs.next(),而当您执行 else 条件时,您将通过执行 @987654323 来跳过第一个元素再次@。

为了解决你的问题,我建议你做这样的事情,不使用向量:

ResultSet res=stat.executeQuery(query);
        while (res.next()){
            model.setRowCount(model.getRowCount() + 1);
            int currentRow = model.getRowCount() - 1;
            model.setValueAt(res.getString("param1"), currentRow, 0);
            model.setValueAt(res.getString("param2"), currentRow, 1);
            model.setValueAt(res.getString("param3"), currentRow, 2);
            model.setValueAt(res.getString("param4"), currentRow, 3);
            
        }

在此示例中,我使用行计数器,并且有 4 个字段,例如“姓名|姓氏|日期|ID|”这就是为什么你会看到 0,1,2,3。如果您的表格中只有一列,请使用

model.setValueAt(res.getString("something"), currentRow, 0);

如果你一直想使用你的向量,你需要每次在while循环中初始化它:

Vector v;
while(rs.next()){
   v=new Vector();
   .....
}

【讨论】:

  • 否则不会跳过第一行。我在表格中有 10 行,它将第一行打印 10 次。
  • 编辑无矢量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2016-06-24
  • 2016-03-04
  • 2021-06-08
  • 2021-11-02
  • 2015-07-19
  • 2019-03-19
相关资源
最近更新 更多