【问题标题】:How to delete searched row from jtable and sql database based on searched value如何根据搜索值从 jtable 和 sql 数据库中删除搜索的行
【发布时间】:2016-05-14 09:23:02
【问题描述】:

我创建了一个带有名为 users 的表的 sql 数据库。它包含 user_id、user_name 和电子邮件。我创建了一个表单,允许用户搜索任何记录并在JTable 上显示过滤后的记录。

我想删除搜索结果根据搜索值过滤的行,这意味着用户可以搜索 user_id、user_name 或电子邮件。

用户 {user_id, user_name, email}

这就是我所拥有的

private void deleteSelectedRows(){
   try {
        String sql = "DELETE from user where ? = ?";
        pst = conn.prepareStatement(sql);
        pst.setString(1, searchTxt.getText());
        pst.setString(2, searchTxt.getText());
       ((DefaultTableModel)userTable.getModel()).removeRow(userTable.getSelectedRow());

      pst.execute();

    } catch (Exception e){
        JOptionPane.showMessageDialog(null, e);
    }
} 

searchTxt 是文本字段。 此代码删除我表中的所有行。

如果我将其更改为DELETE from user where user_id = ?,它只会在用户ID搜索时删除该行。

【问题讨论】:

    标签: java mysql sql-server swing


    【解决方案1】:

    用户 {user_id, user_name, email}

       private void deleteSelectedRows(){
           try {
              String sql = "DELETE from user where ? = ?";
              pst = conn.prepareStatement(sql);
              pst.setString(1, searchTxt.getText());
              pst.setString(2, searchTxt.getText());
    
             ((DefaultTableModel) userTable.getModel()).removeRow(userTable.getSelectedRow());
    
             pst.execute();
        } catch (Exception e){
             JOptionPane.showMessageDialog(null, e);
        }
     }
    

    使用该代码,您总是会完全删除表,因为您总是在 WHERE 子句中获得 TRUE

    如果searchTxt.getText() 是“hello”,则准备好的语句将是

       DELETE from user where hello = hello
    

    相当于

       DELETE from user where true
    

    或者

       DELETE from user
    

    您只需区分searchTxtcolumnName

       private void deleteSelectedRows(){
           try {
              String sql = "DELETE from user where ? = ?";
              pst = conn.prepareStatement(sql);
              pst.setString(1, columnName);
              pst.setString(2, searchTxt.getText());
    
             ((DefaultTableModel) userTable.getModel()).removeRow(userTable.getSelectedRow());
    
             pst.execute();
        } catch (Exception e){
             JOptionPane.showMessageDialog(null, e);
        }
     }
    

    【讨论】:

    • 谢谢。这是一个很好的解释。由于涉及多个列,我是否使用多个列名?
    • @TLin 但是您还必须使用不同的 searchTxt,每个 columnName 一个,并且如果不是所有字段都用于搜索,则必须以动态方式构建查询。如果有用,请务必将答案标记为已接受。
    • 我使用了一个组合框并将搜索修复为基于从组合框中选择的值,并且它起作用了!谢谢你,你的批准正在路上!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2017-10-14
    • 2015-02-15
    • 2019-01-08
    相关资源
    最近更新 更多