是迭代jTable并将列值传递给java中的sql查询
我有一个4列6行的jTable。我想遍历这些行,提取列index0的值,这是我的ID列,并将其传递给count 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 ++)
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){
}