# Ausgewählten Jtable Eintrag aus Db löschen



## AML (27. Mrz 2012)

Hallo zusammen..

Habe eine kleine Frage und konnte mit Googeln keine genaue Antwort finden.

Also Folgendes: Ich habe einen Frame wo ich Benutzer verwalten kann. Ist eine MSAcces datenbank mit

User_id
User
pass
userrole

Jetzt möchte ich einen Button der einen ausgewählten Eintrag in einer JTable löscht, bisher habe ich folgenden Code der bei dem Buttonklick aufgerufen wird.: 


```
private void DeleteFromTable(){
         
         
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    int numRows = jTable1.getSelectedRows().length;
    for(int i=0; i<numRows ; i++ ) model.removeRow(jTable1.getSelectedRow());
         
     }
```

Das heisst ich kann die Rows der Jtable bereits einwandfrei löschen. Logischerweise werden so aber nur die JTable Rows gelöscht aber nicht die Datenbankeinträge selber. 

Aber wie genau teil ich das jetzt dem Button mit dass er die ausgewählte Reihe auch in der Datenbank löschen soll? 
Also dass er Quasi die User_ID aus dem ausgewählten Jtable eintrag ausliest und in einem nächsten SQL Befehl löscht?


----------



## Camino (27. Mrz 2012)

Na ja, du musst natürlich auch noch gleichzeitig eine Verbindung zur Datenbank herstellen und einen SQL-Befehl dorthin schicken (der in etwa so ähnlich aussehen könnte: "DELETE FROM table WHERE ID = id"). Kommt halt auch drauf an, wie du die Daten in die Tabelle gebracht hast. Am besten wäre ein eigenes TableModel mit Objekten, bei denen du dann über die selektierte Zeile zu dem Objekt kommst und dort die ID auslesen kannst, die gelöscht werden soll.


----------



## SlaterB (27. Mrz 2012)

> Aber wie genau teil ich das jetzt dem Button mit

so genau wie es nur geht, mit einer Code-Zeile nach der anderen:
int userId = ..;
DB.delete(userId);
usw.
die Stelle im Code für die neuen Zeilen dürfte klar sein

was du inhaltlich an Code brauchst, kann niemand wissen,
wenn du eine bestimmte Frage hast, etwa 'wie bekomme ich aus dem Model die Daten aus Zeile x, vor dem remove'
dann stelle sie ruhig auch


----------



## AML (27. Mrz 2012)

Ok, also hier einmal meine Connect methode:


```
public void connect()
    {
       try
       {
           //Konfiguration der DB
           //Herstellen der Verbindung zur verschlüsselten Datenbank
           String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
           Class.forName(driver);
           
           String db = "jdbc:odbc:User";

           lManager.getConfigData();
           StringBuilder lConnectionString = new StringBuilder();
           lConnectionString.append( "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" );    
           lConnectionString.append( lManager.getDbPath() );
           lConnectionString.append( ";PWD=*****" );
           System.out.print( lConnectionString.toString() );
           con = DriverManager.getConnection
           ( lConnectionString.toString() ); 
           st = con.createStatement();
       }
       catch(Exception ex){
           
       }
           
    }
```

Danach die Methoden.


```
private void UpdateTable(){
         
         
         String sqlupdate = "Select * from User";
         
         try{
             pst = con.prepareStatement(sqlupdate);
             rs = pst.executeQuery();
             jTable1.setModel(DbUtils.resultSetToTableModel(rs));
             
         }
         catch(Exception e){
             
         }
         
     }
     
     private void DeleteFromTable(){
         
         
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    int numRows = jTable1.getSelectedRows().length;
    for(int i=0; i<numRows ; i++ ) model.removeRow(jTable1.getSelectedRow());
         
     }
```

Beim öffnen des Frames wird dann UpdateTable(); ausgeführt:


```
private void formWindowOpened(java.awt.event.WindowEvent evt) {
        
        UpdateTable();
    }


  private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
       try
       {       
               
       }
        catch(Exception e){
            
        }
        
        DeleteFromTable();
    }


    }
```

Aber für das Action Event beim Buttonklick bin ich noch etwas hilflos. Beim Button Hinzufügen habe ich keine Probleme und habe es so gelöst:
(Sind vorerst nur Textfields zum probieren, wird noch geändert)


```
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        try
                {
                    
                    String user = jTextField1.getText().trim();
                    String pass = jTextField2.getText().trim();
                    String userrole = jTextField3.getText().trim();
                    String sql = ("INSERT INTO User (user, pass, userrole)"
                            + " VALUES ('" + user + "','" + pass + "','"+ userrole+"') ");
                                                      
                    st = con.createStatement();
                    
                    st.executeUpdate(sql);
                    
                     JOptionPane.showMessageDialog(null, "Benutzer wurde erstellt");
                }
                
          catch (Exception e)
        {
            e.printStackTrace();
        }                             
    }
```

Aber irgendwie steh ich da bei der Deletefunktion gerade etwas auf dem Schlauch. 

Konkret: Wenn ich den Löschen Button klicke möchte ich dass die User_ID des selektierten JTable Eintrags ausgelesen wird und der Eintrag nicht nur von der JTable (Status Quo), sondern auch in der Datenbank gelöscht wird.


Habe mal einen Screenshot angehängt damit man sich darunter was vorstellen kann.


----------



## SlaterB (27. Mrz 2012)

> Konkret: Wenn ich den Löschen Button klicke möchte ich [..]

diese Information war schon bekannt, konkret beschreibst du nach wie vor nicht, welche Art von Problemen du damit hast,
Erwähnung von Schläuchen und anderen Gartengeräten bringt da auch nix,

die erste Aufgabe ist doch ziemlich klar, anhand der Selektion aus dem Tabellen-Modell eine UserId zu bestimmen,
machen oder nicht, fragen oder nicht, aber es muss doch irgendeine Idee oder konkretes Hindernis geben?

das schöne an einem Forum ist, dass du alle Zeit der Welt hast, nachzudenken und Sätze zu formulieren


----------



## Camino (27. Mrz 2012)

```
jTable1.setModel(DbUtils.resultSetToTableModel(rs));
```

Wo kommt denn dieses DbUtils in der Methode UpdateTable() her? Das steckt das ResultSet ins TableModel. Vielleicht gibt es da ja auch eine Methode, mit welcher die geänderte Table bzw. das Model zurück in die DB geschrieben werden kann.


----------



## AML (27. Mrz 2012)

SlaterB hat gesagt.:


> > Konkret: Wenn ich den Löschen Button klicke möchte ich [..]
> die erste Aufgabe ist doch ziemlich klar, anhand der Selektion aus dem Tabellen-Modell eine UserId zu bestimmen,
> machen oder nicht, fragen oder nicht, aber es muss doch irgendeine Idee oder konkretes Hindernis geben?



Viele Dinge die für dich klar sind, sind es für mich leider noch lange nicht  

Also hier mal meine ersten Versuche. 


```
try
       {       
               Integer userid = (Integer) jTable1.getValueAt(0, 0);
               String sqldel = ("Delete from User where id ='" 
                       + userid +"");
               
               st = con.createStatement();
               
               st.executeUpdate(sqldel);   
       }
        catch(Exception e){
            
        }
        
        DeleteFromTable();
```

Ich weiss also quasi überhaupt nicht mit was ich anfangen soll. Wie lese ich den Wert aus der ID-Wert der selektieren Tabelle aus? Dürfte ja irgendwas mit getSelectedRow sein aber ich bin leider noch ein ziemlicher Anfänger in Sachen Java und Jtables..


----------



## SlaterB (27. Mrz 2012)

getSelectedRow() hattest du doch bisher schon im Code, 
an JTable.getValueAt() hatte ich selber gar nicht gedacht, würde beim Model was abfragen, aber wenn es so geht warum nicht?

getValueAt() benötigt row + column, getSelectedRow() liefert hoffentlich die Zeile, die Spalte musst du selber wissen,
kommt da nichts bei raus? bisschen ausprobieren ist auch immer erlaubt

der Rest sieht ja schon nach ein bisschen aus, wobei die Connection con sicher noch irgendwo her zu holen ist usw.,
immer weiter, immer weiter


----------



## AML (27. Mrz 2012)

Habe es jetzt alles in die Methode DeleteFromTable() zusammengefügt:


```
private void DeleteFromTable() throws SQLException{
         
         
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    int numRows = jTable1.getSelectedRows().length;
    int userid = (int) jTable1.getValueAt(0,1);
    
    for(int i=0; i<numRows ; i++ ) model.removeRow(jTable1.getSelectedRow());
    
    String sqldel = ("Delete from User where id ='" 
                       + userid+"");
               
               st = con.createStatement();
               
               st.executeUpdate(sqldel);   
               System.out.print(numRows);
         
     }
```

Der erste Teil funktioniert wie gesagt einwandfrei. Beim Öffnen des Frames wird der Table mit den vorhandenen Daten angezeigt und wenn ich auf löschen drücke verschwinden die Einträge. Beim erneuten Öffnen sind die Einträge aber wieder vorhanden da sie nicht aus der db gelöscht werden können. Der Fehler liegt also irgendwo bei meiner SQL abfrage oder bei "int userid =.."


----------



## SlaterB (27. Mrz 2012)

>  int userid = (int) jTable1.getValueAt(0,1);
enthält nirgendwo getSelectedRow(), ist da noch mehr zu zu sagen?

wenn du eine Zahl 700 addieren willst, musst du auch +700 schreiben, nicht +48, 
das ist nun keine Hochkunst, die erst erklärt werden muss

das SQL ist auch noch falsch, aber da kommen sicher Fehlermeldungen,
das musst du schon alles weitgehend selber schaffen, 
du kannst kaum für jeden schief eingehauenen Nagel im Baumarkt nachfragen


----------

