是遍历jTable并将列值传递给java中的sql查询

Posted

技术标签:

【中文标题】是遍历jTable并将列值传递给java中的sql查询【英文标题】:Is to iterate through a jTable and pass column values to an sql query in java 【发布时间】:2015-08-18 06:26:43 【问题描述】:

我有一个 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);
    

这让我想到了下一个问题。我不确定我是应该为它开始一个新线程还是继续这个线程。我的挑战是我现在想在当前 jTable2 上的现有 4 列中附加一个附加列,并显示上述查询的值。添加一个新列,我使用了这个代码,

TableColumn c = new TableColumn();
c.setHeaderValue("Training accomplished");
model.addColumn(c);

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

【问题讨论】:

它不起作用主要是因为你的 for 循环是错误的。 row 永远不会是 &gt; jTable2.getRowCount()col 相同。列从 0 开始,而不是从 1 开始。您还应该学会正确使用准备好的语句。它们的全部意义在于传递参数并避免字符串连接来传递它们。最后,停止捕获异常并忽略它们。这样做是在自取其辱:如果抛出异常,您将不知道。 select COUNT(COURSEBOOKED) as summedValue ... 那么你可以使用rs.getString("summedValue") 代替。我想你会发现数据库正在为列分配它自己的“名称”,这与你的不匹配(作为猜测) 1.当您只需要索引为 0 的单元格时,为什么要使用第二个 for 循环(在单元格上迭代)?此外,正如 JB 已经告知的那样,两个循环的终止条件都是错误的。您应该使用&lt; 代替&gt;。 2.正如JB已经说过的,使用准备好的语句。去谷歌上查询。 3. 为什么每次需要触发查询时都要创建新连接?非常低效。 4. 如 MadProgrammer 所述,在查询中使用别名。它将帮助您获得结果。 你应该为新问题开始一个新问题。 【参考方案1】:

您应该使用如下所示的内容。请注意,到目前为止我还没有测试过这段代码,所以你可能需要调试它。还要检查您问题上的 cmets。

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)

【讨论】:

至少,您在答案中发布的代码应该可以编译...投反对票。 很高兴@hd1:P 现在等一下。我们现在将 try-with-resources 作为一项功能。你知道吗?它已经陪伴我们很长时间了。此外,您已经编辑了代码。如果你有任何问题,也许你可以格式化代码。 谢谢你们,你们的建议很有魅力。您的提议代码@Aakash 可以在一些小的 tweeks 中工作 如果这解决了您的问题,请选择它作为答案。

以上是关于是遍历jTable并将列值传递给java中的sql查询的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 循环遍历表并将行的每个条目传递给存储过程

将表中的列值作为参数传递给存储过程 sql

根据 JTable 中的第一列值着色特定行?

如何遍历表的列名并将值传递给 MSSQL while 循环中的 UDF

循环遍历一张表中的列值并将另一列中的 COUNTIF 值粘贴到另一张表中

将列值分配给数据框中的变量