Как я могу удалить или обновить запись SQL из JTable в Java Swing - PullRequest
0 голосов
/ 19 июня 2019

Я пишу на Java Swing SQL проекта. Я застрял при удалении и обновлении информационной записи. Я могу добавить новую запись как обычно, но не могу обновить или удалить ее. Когда я удаляю, он будет уведомлять «не могу найти номер столбца». Вот мой код и изображение сообщения об ошибке. Заранее спасибо.

enter image description here

private void JtbDeleteActionPerformed(java.awt.event.ActionEvent evt) {                                          
  int row = jtbStudent.getSelectedRow();
    String cell = jtbStudent.getModel().getValueAt(row, 0).toString();
    try {
        stm = cnn.createStatement();
        if (JOptionPane.showConfirmDialog(null, "Are you sure?", "WARNING",
    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
        stm.execute("DELETE FROM Student where RollNo = " + cell);
        loadTable();
        JOptionPane.showMessageDialog(null, "Delete Successfully");
    } else {
        JOptionPane.showMessageDialog(null, "Delete Unsuccesfully!");
    }

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }
    finally{
        try {
            stm.close();
            rs.close();
        } catch (Exception e) {
        }
    }
}      

Кнопка обновления

 private void jbtUpdateActionPerformed(java.awt.event.ActionEvent evt) {       
  try {
        int row = jtbStudent.getSelectedRow();
        String cell = jtbStudent.getModel().getValueAt(row, 0).toString();
        stm = cnn.createStatement();
        String value1 = jtxName.getText();
        String value2 = jtxMark.getText();
        String sql="UPDATE Student set Name='"+value1+"' ,mark='"+value2+"' 
,where RollNo = '" + cell + "'";
        stm.execute(sql);
        System.out.println("Update success!");
        loadTable();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }

1 Ответ

2 голосов
/ 19 июня 2019

Вы используете недопустимый SQL-оператор.Строка, которую вы пишете (и отправляете в базу данных): DELETE FROM Student where RollNo = A02.

То, что вы ожидаете (в действительном SQL), будет: DELETE FROM Student where RollNo = 'A02'.

Теперь для простоты вы можетеиспользуйте

stm.execute("DELETE FROM Student where RollNo = '" + cell + "'");

Но это будет открыто для SQL-инъекции, а это означает, что если строка в переменной cell может читать что-то вроде "'; drop table student;", ваша база данных отбросит таблицу студентов.

Лучше использовать подготовленное утверждение (https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html):

PreparedStatement stm = cnn.prepareStatement("DELETE FROM Student where RollNo = ?");
stm.setString(1, cell);
boolean result = stm.execute();

Таким образом, String должным образом экранируется. За подробностями обращайтесь к документации jdbc.

PreparedStatement - https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html Соединение - https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#prepareStatement(java.lang.String)

...