2017-08-25 1 views
5

Ich habe Probleme beim Aktualisieren von Daten aus der Datenbank durch Bearbeiten/Ändern von Zellenwerten und Klicken auf die Schaltfläche Aktualisieren, aber er kann die Datenbank, die ich in die Zelle geändert habe, nicht ändern. es ist immer noch dasselbe in dem letzten Wert. mein CodeJava-Update-Datenbank durch Bearbeiten von Zellen funktioniert nicht?

hier:

public void directlyup() { 
     int col=tablesample.getSelectedColumn(); 
     int row=tablesample.getSelectedRow(); 
     int index; 
     index = Integer.parseInt(tablesample.getModel().getValueAt(row, 0).toString()); 
     try { 
      String sql ="UPDATE invoice SET description = ?,qty = ?,unitprice = ?" 
        + ",total = ? WHERE id ="+row; 
      pst = conn.prepareStatement(sql); 
      pst.setString(1, (String) tablesample.getValueAt(row, 1)); 
      pst.setString(2, (String) tablesample.getValueAt(row, 2)); 
      pst.setString(3, (String) tablesample.getValueAt(row, 3)); 
      pst.setString(4, (String) tablesample.getValueAt(row, 4)); 
      pst.execute(); 
      JOptionPane.showMessageDialog(null, "Successfully Updated"); 
     } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
     } 
    } 
+3

Was ist Ihre Frage? –

+1

Willkommen bei SO. Die bereitgestellten Informationen sind nicht ausreichend, um Ihnen zu helfen. Versuchen Sie, 'index' und' (String) tablesample.getValueAt (row, X) 'auszudrucken. Sie werden überrascht sein. – c0der

+0

Ich versuche schon, den Index zu setzen: String sql = "UPDATE Rechnung SET Beschreibung =?, Menge =?, Unitprice =?" + ", gesamt =? WHERE id =" + index; aber die einzige kann aktualisieren ist die erste Zeile und die anderen werden die gleichen wie die erste Zeile –

Antwort

6
String sql ="UPDATE invoice SET description = ?,qty = ?,unitprice = ?" 
       + ",total = ? WHERE id ="+row; 

Warum versuchen Sie die where-Klausel eine Variable in der SQL einzubetten?

Verwenden Sie einfach einen Parameter wie für die anderen Werte. Es hält die SQL einfacher:

String sql = 
    "UPDATE invoice SET description = ?, qty = ?, unitprice = ?, total = ? WHERE id = ?"; 
... 
pst.set???(5, row); 
+0

danke es funktioniert wirklich für die Aktualisierung einer bestimmten Zeile, die ich in jtable geändert, aber was ist, wenn ich alle Zeilen, die ich geändert habe, aktualisieren möchte? –

+0

Was meinst du? Sie können immer nur eine Zeile gleichzeitig ändern, sodass Sie den Code jedes Mal aufrufen, wenn eine Änderung vorgenommen wird. – camickr

1

Es kann sein, dass Sie Index stattdessen in der WHERE-Klausel der Reihe zu verwenden beabsichtigt?

String sql ="UPDATE invoice SET description = ?,qty = ?,unitprice = ?" 
       + ",total = ? WHERE id ="+index; 
1

vorausgesetzt, Sie mehrreihige ausgewählt haben, wenn Sie Ihre ID int:

int[]rows=tablesample.getSelectedRows(); 


String sql="UPDATE invoice SET description = ?,qty = ?,unitprice = ?" 
     + ",total = ? WHERE id =?"; 

try{ 
    PreparedStatement pst = conn.prepareStatement(sql); 
    for(int currentRow:rows){ 


       pst.setString(1, (String) tablesample.getValueAt(currentRow, 1)); 
       pst.setString(2, (String) tablesample.getValueAt(currentRow, 2)); 
       pst.setString(3, (String) tablesample.getValueAt(currentRow, 3)); 
       pst.setString(4, (String) tablesample.getValueAt(currentRow, 4)); 
       pst.setInt(5, currentRow); 
       pst.executeUpdate(); 



     } 
    JOptionPane.showMessageDialog(null, "Successfully Updated"); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } finally{ 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

für die beste Leistung, die Sie executeBatch wie diese example

2

Für CRUD-Operationen auf einem Datensatz verwenden, es ist nett, einen Zwischentisch zu verwenden. Dies vermeidet die große Anzahl von Abfragen, die auf große Datenmengen gelegt werden.

Vor meinem Vorschlag geben, das Problem zu lösen, würde Ich mag einige Bemerkungen darauf hin, ich auf der Struktur der Datenbank habe:

  1. Die total Feld ist offensichtlich ein berechnetes Feld. Solche Informationen können nicht in die Datenbank eingegeben werden. Es wird auf Anfrage berechnet.
  2. Der gesamte Datensatz ist offensichtlich Teil eines Dokuments (Rechnung). Daher muss in der Datenbank ein Feld vorhanden sein, das das Dokument eindeutig identifiziert, auf das sich die Daten beziehen.

Auch ich möchte sagen, dass solche Entscheidungen für eine bestimmte Datenbank getroffen werden. In diesem Fall betrifft meine Lösung mysql.

Dies ist die DDL der Tisch, auf dem der untere Code-Schnipsel

CREATE TABLE `invoice` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `invoice_id` int(10) unsigned NOT NULL, 
    `description` varchar(255) DEFAULT NULL, 
    `qty` double DEFAULT NULL, 
    `unitprice` double DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB 

läuft Und dies ist der Code, der Operationen CRUD auf einen Datensatz mit dem Dokument-ID-Taste (invoce_id) macht.

public boolean save(long invoice_id, List<Invoice> list) throws SQLException { 
    try(Connection connection = getConnection()) { 
     try { 
      connection.setAutoCommit(false); 

      String query = 
        "create temporary table if not exists `invoice_tmp` (" + 
          "`id` int(10) unsigned NOT NULL," + 
          "`description` varchar(255) DEFAULT NULL," + 
          "`qty` double DEFAULT NULL," + 
          "`unitprice` double DEFAULT NULL)"; 

      connection.createStatement().executeUpdate(query); 

      query = "insert into `invoice_tmp` values (?, ?, ?, ?)"; 
      PreparedStatement statement = connection.prepareStatement(query); 
      for(Invoice invoice: list) { 
       statement.setLong(1, invoice.getId()); 
       statement.setString(2, invoice.getDescription()); 
       statement.setDouble(3, invoice.getQty()); 
       statement.setDouble(4, invoice.getUnitPrice()); 

       statement.addBatch(); 
      } 

      statement.executeBatch(); 
      statement.close(); 

      query = 
        "delete invoice from invoice " + 
        "left join invoice_tmp on (invoice.id = invoice_tmp.id) " + 
        "where invoice_id = ? and invoice_tmp.id is null"; 

      statement = connection.prepareStatement(query); 
      statement.setLong(1, invoice_id); 
      statement.executeUpdate(); 
      statement.close(); 

      query = 
        "update `invoice` " + 
        "join `invoice_tmp` using (`id`) " + 
        "set " + 
          "`invoice`.description = `invoice_tmp`.description, " + 
          "`invoice`.qty = `invoice_tmp`.qty, " + 
          "`invoice`.unitprice = `invoice_tmp`.unitprice"; 

      connection.createStatement().executeUpdate(query); 

      query = 
        "insert into `invoice` (`invoice_id`, `description`, `qty`, `unitprice`) " + 
        "select ? as `invoice_id`, `description`, `qty`, `unitprice` from `invoice_tmp` where `id` = 0"; 

      statement = connection.prepareStatement(query); 
      statement.setLong(1, invoice_id); 
      statement.executeUpdate(); 
      statement.close(); 

      connection.createStatement().executeUpdate("drop table if exists `invoice_tmp`"); 

      connection.commit(); 
      return true; 
     } 
     catch (Exception e) { 
      connection.rollback(); 
      throw e; 
     } 
    } 
} 

this ist ein Testprojekt, wie Sie den Code oben genannten Arbeiten demonstriert.

Verwandte Themen