.next在Java的ResultSet中不起作用

问题描述

.next()在此代码中不起作用。我尝试了很多,但徒劳无功。例如,如果我在branch_issuance_g_item_vise(数据库名称)中有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);
    }
}

解决方法

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

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

,

while之前添加rs.beforeFirst,然后将 Vector ArrayList创建的内容移入循环

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

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

您应该使用ArrayList而不是Vector

,

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

为解决您的问题,我建议您不使用向量就执行以下操作:

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"),1);
            model.setValueAt(res.getString("param3"),2);
            model.setValueAt(res.getString("param4"),3);
            
        }

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

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

如果您一直想使用向量,则需要在while循环中每次都将其初始化:

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