簡體   English   中英

刪除,更新時的java JDBC ArrayIndexOutOfBoundsException

[英]java JDBC ArrayIndexOutOfBoundsException when delete, update

因此,我嘗試創建一個通過JBDC連接到SQL Server數據庫的JTable,並具有諸如插入,刪除和編輯數據的功能。 它可以很好地與插入但更新,刪除一起使用。 你們能告訴我為什么我得到ArrayIndexOutOfBoundsException: -1以及如何解決它。 這是我的代碼。 本書在這里是一個擴展JFRAME的類

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);
    }

}

您會收到此錯誤,因為您沒有選擇任何行,因此要避免此問題,您必須使用:

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
}

注意

代替 :

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

您必須使用PreparedStatement避免任何語法錯誤或SQL注入

例如 :

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();
}

另一件事,您的id是一個int因此您不能像必須設置int那樣為查詢設置String:

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

相反,您必須使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM