是遍历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
永远不会是 > jTable2.getRowCount()
。 col
相同。列从 0 开始,而不是从 1 开始。您还应该学会正确使用准备好的语句。它们的全部意义在于传递参数并避免字符串连接来传递它们。最后,停止捕获异常并忽略它们。这样做是在自取其辱:如果抛出异常,您将不知道。
select COUNT(COURSEBOOKED) as summedValue ...
那么你可以使用rs.getString("summedValue")
代替。我想你会发现数据库正在为列分配它自己的“名称”,这与你的不匹配(作为猜测)
1.当您只需要索引为 0 的单元格时,为什么要使用第二个 for 循环(在单元格上迭代)?此外,正如 JB 已经告知的那样,两个循环的终止条件都是错误的。您应该使用<
代替>
。 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查询的主要内容,如果未能解决你的问题,请参考以下文章
如何遍历表的列名并将值传递给 MSSQL while 循环中的 UDF