Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是迭代jTable并将列值传递给java中的sql查询_Java_Swing_Jdbc_Jtable - Fatal编程技术网

是迭代jTable并将列值传递给java中的sql查询

是迭代jTable并将列值传递给java中的sql查询,java,swing,jdbc,jtable,Java,Swing,Jdbc,Jtable,我有一个4列6行的jTable。我想遍历这些行,提取列index0的值,这是我的ID列,并将其传递给count sql查询。我已经编写了下面的代码,但它不起作用,因为我还没有弄清楚在遍历表之后如何传递列值 有人能告诉我我的代码出了什么问题吗 for (int row = 0; row > jTable2.getRowCount(); row++){ for (int col =0; col > jTable2.getColumnCount(); col ++)

我有一个4列6行的jTable。我想遍历这些行,提取列index0的值,这是我的ID列,并将其传递给count sql查询。我已经编写了下面的代码,但它不起作用,因为我还没有弄清楚在遍历表之后如何传递列值

有人能告诉我我的代码出了什么问题吗

for (int row = 0; row > jTable2.getRowCount(); row++){
        for (int col =0; col > jTable2.getColumnCount(); col ++)
        try{
            DefaultTableModel model = (DefaultTableModel)jTable2.getModel();
            String selected = model.getValueAt(row, col+1).toString();
            String sql = "select COUNT(COURSEBOOKED) from APP.BOOKCOURSE where COURSEBOOKED = '"+selected+"'"; 
            try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
                PreparedStatement pst = con.prepareStatement(sql);) {
                    ResultSet rs = pst.executeQuery();
                    while(rs.next()){
                        String Sum = rs.getString("COUNT(COURSEBOOKED)");
                        System.out.println(Sum);
                        if (rs.wasNull()){
                            System.out.println("No record found");
                        }
                    }
            }
            catch(SQLException e){
            }
        }
        catch(Exception e){
        }
    }
这是更改后产生的最终代码

        String sql = "select COUNT(COURSEBOOKED) as count from APP.BOOKCOURSE where COURSEBOOKED =?";
    try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
            PreparedStatement pst = con.prepareStatement(sql);){
                 for(int row = 0; row < jTable2.getRowCount(); row++){
                        DefaultTableModel model = (DefaultTableModel)jTable2.getModel();
                        String selected = model.getValueAt(row, 1).toString();
                        pst.setString(1, selected);
                        try(ResultSet rs = pst.executeQuery();){
                             while (rs.next()){
                                String Sum = rs.getString("count");
                                System.out.println(Sum);
                             }
                        }
                    }
                }
    catch(SQLException e){
        JOptionPane.showMessageDialog(this, e);
    }

这会添加该列,但会使用列index0中的值填充该列。如何让新添加的列由上面查询中的Sum值填充。

您应该使用以下内容。请注意,到目前为止我还没有测试这段代码,所以您可能需要调试它。同时检查对您的问题的评论

String sql = "select COUNT(COURSEBOOKED) as count from APP.BOOKCOURSE where COURSEBOOKED = ?"; 
try(
   Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
   PreparedStatement pst = con.prepareStatement(sql);){
   for (int row = 0; row < jTable2.getRowCount(); row++){
        DefaultTableModel model = (DefaultTableModel)jTable2.getModel();
        String selected = model.getValueAt(row, 0).toString();
        pst.setString(1, selected);            
        ResultSet rs = pst.executeQuery();
        while(rs.next()){
            String Sum = rs.getString("count");
            System.out.println(Sum);
            if (rs.wasNull()){
                System.out.println("No record found");
            }
        }
    }
}
catch(SQLException e){
}
catch(Exception e){
}

它不起作用主要是因为for循环错误。行永远不会>jTable2.getRowCount。列和列从0开始,而不是从1开始。您还应该学会正确使用准备好的语句。它们的全部目的是传递参数,并避免通过字符串连接来传递参数。最后,停止捕获异常并忽略它们。如果抛出异常,您将不会知道。选择COUNTCOURSEBOOKED作为summedValue。。。然后就可以使用rs.getStringsummedValue了。我想您会发现数据库正在为列分配自己的名称,这与您的猜测不匹配1。当您只需要索引为0的单元格时,为什么要使用在单元格上迭代的第二个for循环?此外,正如JB所说,两个循环的终止条件都是错误的。你应该使用。2.正如JB已经说过的,使用准备好的语句。谷歌。3.为什么每次需要启动查询时都要创建新连接?效率很高。4.如程序员所述,在查询中使用别名。它将帮助你获得结果。你应该为新问题开始一个新问题。至少,你在答案中发布的代码应该编译。。。投反对票。很高兴@hd1:PNow,请稍等。我们现在已经尝试将资源作为一项功能。你知道吗?它已经陪伴我们很长一段时间了。此外,您还编辑了代码。如果你有任何问题,也许你可以格式化代码。谢谢你们,你们的建议很有效。您的建议代码@Aakash与一些小错误一起工作。如果这解决了您的问题,请选择它作为答案。
String sql = "select COUNT(COURSEBOOKED) as count from APP.BOOKCOURSE where COURSEBOOKED = ?"; 
try(
   Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
   PreparedStatement pst = con.prepareStatement(sql);){
   for (int row = 0; row < jTable2.getRowCount(); row++){
        DefaultTableModel model = (DefaultTableModel)jTable2.getModel();
        String selected = model.getValueAt(row, 0).toString();
        pst.setString(1, selected);            
        ResultSet rs = pst.executeQuery();
        while(rs.next()){
            String Sum = rs.getString("count");
            System.out.println(Sum);
            if (rs.wasNull()){
                System.out.println("No record found");
            }
        }
    }
}
catch(SQLException e){
}
catch(Exception e){
}