2015-12-13 2 views
0

У меня проблема, когда моя программа GUI не показывает ошибки, а также не обновляет jTable с помощью инструкции UPDATE, которую я даю. INSERT и DELETE работают нормально, но это не по какой-то причине.Команда SQL SQL UPDATE не работает

Я использую UCanAccess, поэтому я могу использовать базу данных MSAccess и rs2xml для материалов набора результатов.

Таблица, которую я изменяю, представляет собой таблицу соединений с двумя первичными ключами для director_id и movie_id, которые связаны с отдельными таблицами, поэтому это отношение «многие ко многим».

private void jButtonEditActionPerformed(java.awt.event.ActionEvent evt) {            
     DefaultTableModel tableModel = (DefaultTableModel) jTableDBView.getModel(); 

     // If there's an issue... 
     if(error handling snipped out...) 
     { 
     } 
     else 
     { 
      runQuery(Integer.parseInt(jTextFieldDirectorID.getText()), Integer.parseInt(jTextFieldMovieID.getText()), "UPDATE"); 
      jTextAreaDBView.append("Updated row: " + (jTableDBView.getSelectedRow() + 1) + " (Director ID: " + jTextFieldDirectorID.getText() + " & Movie ID: " + jTextFieldMovieID.getText() +")\n"); 
      updateDB(); 
     } 

Который называет ...

public void runQuery(int movieID, int directorID, String typeOfCommand) throws SQLException 
{ 
    Connection conn = DriverManager.getConnection(jdbcURL); 
    ResultSet rs = null; 
    PreparedStatement stat = null; 

    try 
    { 
     //snipped insert/delete 

     else if(typeOfCommand.equals("UPDATE")) 
     { 
      stat = conn.prepareStatement("UPDATE Movie_Directors SET director_id = ?, movie_id = ? WHERE (director_id = ?) AND (movie_id = ?)"); 
      stat.setInt(1, directorID); 
      stat.setInt(2, movieID); 
      stat.setInt(3, directorID); 
      stat.setInt(4, movieID); 

      int result = stat.executeUpdate(); 
     } 

И

private void updateDB() 
{ 
    try 
    { 
     Connection conn = DriverManager.getConnection(jdbcURL); 
     PreparedStatement pst = conn.prepareStatement(query); 
     Class.forName(driver); 
     ResultSet rs = pst.executeQuery(); 
     jTableDBView.setModel(DbUtils.resultSetToTableModel(rs)); // Imported lib function 
     conn.close(); 
     pst.close(); 
     rs.close(); 
    } 
    catch (Exception ex) 
    { 
     // Add a window here 
    } 
} 

UPDATE - Исправлен блок runQuery с этим: я добавил 2 новых JTextFields для ввода новых данных и I понять, как все это работает сейчас. Спасибо @jan

  int result; 
      int newDirectorID = Integer.parseInt(jTextFieldNewDirectorID.getText()); 
      int newMovieID = Integer.parseInt(jTextFieldNewMovieID.getText()); 

      stat = conn.prepareStatement("UPDATE Movie_Directors SET director_id = ?, movie_id = ? WHERE director_id = ? AND movie_id = ?"); 
      stat.setInt(1, newDirectorID); 
      stat.setInt(2, newMovieID); 
      stat.setInt(3, directorID); 
      stat.setInt(4, movieID); 
      result = stat.executeUpdate(); 
+0

Вы также можете удалить круглые скобки, WHERE director_id =? И movie_id =? –

ответ

1

я мог бы ошибиться - но обновление не делает ничего . Он присваивает (movieId, directorId) к той строке, которая уже имеет точно, что (movieId,directorId)

Так что, если есть уже ряд - ничего не происходит. И если нет соответствующей строки - ничего не происходит.

Обновление имеет смысл, если, например, режиссер фильма действительно изменился в какое-то время.

В этом случае вам потребуется переменная newDirectorID и поместить его в качестве нового значения:

 int newDirectorID; // YOU NEED TO PROVIDE A VALUE 
     stat = conn.prepareStatement("UPDATE Movie_Directors SET director_id = ?, movie_id = ? WHERE director_id = ? AND movie_id = ?"); 
     stat.setInt(1, newDirectorID); 
     stat.setInt(2, movieID); 
     stat.setInt(3, directorID); 
     stat.setInt(4, movieID); 

     int result = stat.executeUpdate(); 

Это было бы фактически изменить некоторые данные в таблице, поэтому количество обновленных строк должно быть 1, если (directorID, movieID) существовал раньше.

+0

Я довольно новичок в этом, но не обновление, предназначенное для изменения существующих данных? Я потратил несколько часов на то, как сделать обновление в таблице соединений с более чем одним первичным ключом в MSAccess в Java и ничего не нашел. Я просто добавляю его для сценария в любом случае, когда директор будет меняться, потому что иногда это происходит. Но на самом деле я просто выбрал тему и поставил ее в роли кино/режиссеров вместо автомобиля/владельца или чего-то еще. –

+0

См. Мое редактирование. В этом случае вам понадобятся как newDirectorID, так и существующий DirectorID. – Jan

Смежные вопросы