【问题标题】:How to do Looping with ResultSet?如何使用 ResultSet 进行循环?
【发布时间】:2019-06-21 13:35:19
【问题描述】:

所以,我想循环这个 ResultSet 以便一一更新表格,但是方法 while(rsl.next()) 无法帮助我进行循环。它只工作一次,然后跳过其他工作。有人可以帮我解决这个问题吗?提前致谢

try {
    String url = "jdbc:mysql://localhost/minimarket";
    String user = "root";
    String pass = "";
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(url, user, pass);
    Statement stmt = conn.createStatement();

    ResultSet rsl = stmt.executeQuery("SELECT * FROM keranjang WHERE pemesan='"+login.userid+"'");

    while (rsl.next()) {
        String nb = rsl.getString("nama_barang");
        String dtl = rsl.getString("detail");
        String beratt = rsl.getString("berat");
        String hrga = rsl.getString("harga");
        String jmlh = rsl.getString("jumlah");
        stmt.executeUpdate("UPDATE barang SET stok=stok+'"+jmlh+"' WHERE nama_barang='"+nb+"' AND detail='"+dtl+"' AND berat='"+beratt+"'");
        stmt.executeUpdate("DELETE FROM keranjang WHERE pemesan ='"+login.userid+"' AND nama_barang='"+nb+"'");
    }

    conn.close();
} catch (Exception error) {

}

System.exit(0);

【问题讨论】:

  • 试试while(rs1.hasNext()){ rs1.next() ...
  • 您的代码显示 if 这不是循环。
  • @NeplatnyUdaj ResultSet 没有 hasNext() 方法。
  • while(rsl.next()) 是正确的。问题可能出在其他地方。请在您尝试使用while 循环的位置发布实际代码。
  • 那么请告诉我们,您在代码中实际使用的是哪一个,ifwhile

标签: java loops resultset


【解决方案1】:

问题:

if (rsl.next())

修复:

while (rsl.next())

调试应用并检查您与数据库的连接是否有效。

【讨论】:

  • 对不起,我实际上使用了while,但遇到了同样的问题。之前的代码是当我尝试使用 if 修复它时,但也不起作用
【解决方案2】:

当您在语句上执行 executeUpdate 时,将返回一个 int,最重要的是,您的查询中的结果集对象 rs1 将关闭并且无法再访问,因为 Statement 类只处理一个查询/结果集。我自己没有对此进行测试,但我很确定这就是原因。

解决方案是有一个单独的Statement 对象用于更新/删除,这样原来的ResultSet 就不会受到影响。如下所示

Statement stmt = conn.createStatement();
Statement updStmt = conn.createStatement();
ResultSet rsl = stmt.executeQuery("SELECT * FROM keranjang WHERE pemesan='"+login.userid+"'");

while (rsl.next()) {
    String nb = rsl.getString("nama_barang");
    String dtl = rsl.getString("detail");
    String beratt = rsl.getString("berat");
    String hrga = rsl.getString("harga");
    String jmlh = rsl.getString("jumlah");

    updStmt.executeUpdate("UPDATE barang SET stok=stok+'"+jmlh+"' WHERE nama_barang='"+nb+"' AND detail='"+dtl+"' AND berat='"+beratt+"'");
    updStmt.executeUpdate("DELETE FROM keranjang WHERE pemesan ='"+login.userid+"' AND nama_barang='"+nb+"'");
}

【讨论】:

  • 谢谢,它解决了问题!
【解决方案3】:

如果我正确理解了您的问题,这里可能存在两个问题:

结果集为空 - 我认为这不可能是因为您会在 while 循环中遇到异常并且不会输出任何内容 第二个问题是 resultset.getString(i++) 将从每个后续行中获取第 1、2、3 列,依此类推 我认为第二点可能是您的问题。

假设您只返回了 1 行,如下所示

Col 1, Col 2, Col3 
A   , B,    C

您的代码只会得到 A - 它不会得到其余的列。

我建议您将代码更改如下:

ResultSet resultset = ...;
ArrayList<String> arrayList = new ArrayList<String>(); 
while (resultset.next()) {              
        int i = 1;
        while(i <= numberOfColumns) {
            arrayList.add(resultset.getString(i++));
        }
        System.out.println(resultset.getString("Col 1"));
        System.out.println(resultset.getString("Col 2"));
        System.out.println(resultset.getString("Col 3"));                    
        System.out.println(resultset.getString("Col n"));
}

获取列数:

ResultSetMetaData metadata = resultset.getMetaData();
int numberOfColumns = metadata.getColumnCount();

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-01-16
    • 2022-01-20
    相关资源
    最近更新 更多