2017-04-22 1 views
2

Donc, j'essaie de créer un JTable qui se connecte à la base de données du serveur SQL par JBDC, et avoir une fonction comme insérer, supprimer et éditer les données. Cela fonctionne bien avec l'insertion mais la mise à jour, la suppression. Pouvez-vous me montrer pourquoi j'ai obtenu ArrayIndexOutOfBoundsException: -1 et comment y remédier. Voici mon code. Livre est une classe étend ici Jframejava JDBC ArrayIndexOutOfBoundsException lors de la suppression, mettre à jour

public Book() { 
    initComponents(); 

    model.addColumn("ID"); 
    model.addColumn("Name"); 
    model.addColumn("Type"); 

    jTable1.setModel(model); 
    displayTable(); 
    jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 
     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      int row = jTable1.getSelectedRow(); 

      txtName.setText(jTable1.getValueAt(row, 1).toString()); 
      txtType.setText(jTable1.getValueAt(row, 2).toString()); 

     } 
    }); 

} 

public void displayTable() { 
    try { 
     model.setRowCount(0); 
     ConnectToSQL sql = new ConnectToSQL(); 
     connection = sql.getConnection(); 
     st = connection.createStatement(); 
     ResultSet result = st.executeQuery("SELECT * FROM BOOK"); 
     while (result.next()) { 
      model.addRow(new Object[]{result.getInt("id"), result.getString("name"), result.getString("type")}); 
     } 

    } catch (SQLException ex) { 
     Logger.getLogger(Book.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) { 
    // TODO add your handling code here: 
    int row = jTable1.getSelectedRow(); 
    String id = jTable1.getValueAt(row, 0).toString(); 
    try { 
     // TODO add your handling code here: 
     st.executeUpdate("Update Book set name ='" + txtName.getText() + "',type='" + txtType.getText() + "' where id =" + id); 
     displayTable(); 

    } catch (SQLException ex) { 
     Logger.getLogger(Book.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) { 
    // TODO add your handling code here: 
    int row = jTable1.getSelectedRow(); 
    String id = jTable1.getValueAt(row, 0).toString(); 
    try { 
     // TODO add your handling code here: 
     st.executeUpdate("Delete from book where id =" + id); 
     displayTable(); 

    } catch (SQLException ex) { 
     Logger.getLogger(Book.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 
+0

dans quelle ligne? Vous obtenez cette erreur –

+0

dans btnUpdateActionPerformed et btnDeleteActionPerformed j'ai obtenu ArrayIndexOutOfBoundsException même si elle toujours supprimer ou mettre à jour à la base de données –

+0

bien «-1» cela se produire lorsque vous ne sélectionnez pas une ligne., Et puis la ligne sélectionnée retour -1'.par exemple si 'row = -1' alors' jTable1.getValueAt (-1, 1) 'et ensuite vous obtenez l'erreur. Pour l'éviter vous pouvez vérifier 'if (row! = - 1) {// faire quelque chose} else {// plz sélectionner une ligne}' –

Répondre

3

Vous obtenez cette erreur, parce que vous ne sélectionnez aucune ligne, afin d'éviter ce problème, vous devez utiliser:

if(jTable1.getSelectedRow() != -1){ 
    int row = jTable1.getSelectedRow(); 
    String id = jTable1.getValueAt(row, 0).toString(); 
    //rest of your code here 
}else{ 
    //show an error for example, no row is selected 
} 

Remarque

Au lieu de:

st.executeUpdate("Update Book set name ='" + txtName.getText() + "',type='" + txtType.getText() + "' where id =" + id); 

Vous devez utiliser PreparedStatement pour éviter toute erreur de syntaxe ou SQL Injection

Par exemple:

String query = "Update Book set name = ?, type=? where id =?"; 

try (PreparedStatement update = connection.prepareStatement(query)) { 

    update.setString(1, txtName.getText()); 
    update.setString(2, txtType.getText()); 
    update.setInt(3, id); 

    update.executeUpdate(); 
} 

Une autre chose, votre id est un int de sorte que vous ne pouvez pas définir une chaîne à votre requête comme vous avez-vous de définir un int:

String id = jTable1.getValueAt(row, 0).toString(); 

au lieu de cela, vous devez utiliser:

int id = Integer.parseInt(jTable1.getValueAt(row, 0).toString()); 
+0

J'ai essayé de corriger comme vous l'avez dit mais il a toujours l'exception, il obtient exception quand jamais j'essaye de mettre à jour le jtable après avoir effacé ou édité des données par la fonction displayTable() –

+0

@ TúAnhDư le 'ArrayIndexOutOfBoundsException' est parti ou pas?, ce que la nouvelle exception non? –

+0

il encore ArrayIndexOutOfBoundsException: -1, je pense que ce n'est pas getselectedRow() chose cause l'exception parce que la base de données mis à jour après cela mais vient de displayTable() –