# Warten bis SQL befehl ausgeführt wurde!



## Java Nooob (30. Sep 2005)

Hi folgendes Problem.

Ich habe mehrere Datenbanlabfragen hintereinander. Die Abfragen beziehen sich alle auf die selbe Tabelle.
Wie kann ich sicherstellen das die Abfagen Zeitlich so ablaufen das der nächste SQL Befehl erst ausgeführt wird wenn der vorherige beendet ist. Hier mal ein bisschen code.


```
public static void conUpdate(String sqlQuery){
        //Überprüfen ob ODBC Treiber vorhanden sind!!
        try {
            Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        }
        catch ( ClassNotFoundException e ) {
            System.out.println( "Fehler bei ODBC-JDBC-Bridge" + e );
            return;
        }

        //Verbindung herstellen mit sqlQuery!
        try {   
            String url = "jdbc:odbc:kn";
            con = DriverManager.getConnection( url, "lutz", "lutz" );
            stmt = con.createStatement(1004, 1008);
            
            //String sqlQuery = "SELECT Name, Abteilung FROM Name WHERE Abteilung =  'STR CI';";
            System.out.println(sqlQuery);
            stmt.executeUpdate( sqlQuery );    
        }
        catch ( SQLException e )
        {
            e.printStackTrace();
            JDialog fehlermeldung = new JDialog();                   
            fehlermeldung.add( new JLabel("Fehler bei Tabellenabfrage" + e ) );
            fehlermeldung.setSize( 500, 100 ); fehlermeldung.setVisible( true );

            return;
        }
        //Datenbankverbindung schließen!
        
    
}
```

in einer anderen Methode werden folgende Befehle nacheinander ausgeführt


```
private void btCheckOutActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
            GregorianCalendar calendar = new GregorianCalendar(); 
            DateFormat dft = new SimpleDateFormat("dd.MM.yyyy HH:mm");
            Date date2 = calendar.getTime(); 
            String Zeit = dft.format(date2);
            
        int id = Integer.valueOf(String.valueOf(TableCheckOut.getValueAt(TableCheckOut.getSelectedRow(),0)));
        database.DataConnection.conUpdate("UPDATE Checkin SET Status = 4, Checkout = '"+Zeit+"' WHERE ID ="+id+"");
        database.DataConnection.conUpdate("INSERT INTO ArchivWD SELECT * FROM Checkin WHERE ID = "+id+"");
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            
        }
        database.DataConnection.conUpdate("DELETE * FROM Checkin WHERE ID = "+id+"");
        
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            
        }
        refresh();
    }
```

Die Methode refresh() beinhaltet auch mehrere SQL Befehle. Habe bis jetzt mit Thread.sleep() gearbeitet. Allerdings kann das ja nicht die wahre Lösung sein. Wie würde die richtige Vorgehensweise lauten.

Danke an alle Helfer!


----------



## Bleiglanz (30. Sep 2005)

der Aufruf stmt.executeUpdate( sqlQuery ); kehrt erst dann zurück wenn das Statement ausgeführt wurde - oder es fliegt eine Exception

verstehe also das Problem nicht ganz?

arbeitest du mit mehreren Threads - wenn ja, dann musst du entweder genau synchronisieren und/oder alles in eine Transaktion stecken, die du am Ende nochmal überprüfst


----------



## Guest (30. Sep 2005)

Ich bin der Meinung Java ist schneller als meine DB!

Denk die mal alle Thread.sleep() weg.

Dan habe ich ja 3 conUpdate() abfragen hintereinander.

1. Update
2. Insert
3. Delete

Eigentlich funktioniert alles soweit.

zu.1 
UPDATE soll mir ja den Status auf 4 setzten.

zu 2
wenn das gemacht ist wird der komplette Datensatz in eine andere Tabelle geschoben

zu 3
und dann soll der Datensatz gelöscht werden.

wenn ich mir jetzt meine Tabellen in Access anschau ist folgendes Problem aufgetaucht.
Löschen und Insert hat funktioniert aber das Update nicht.

In der Tabelle ArchivWD ist der Status = 3!!!!

Wenn ich jetzt zwischen alle conUpdate() ein Thread.sleep() setzte funktioniert alles perfekt.
Das heisst für mich das Java nicht wartet bis der erste SQL befehl vollstandig ausgeführt wurde.

Problem erkannt??

MFG


----------



## AlArenal (30. Sep 2005)

Wenn du nicht mit mehreren Threads arbeitet, kann Java nicht "schneller" sein, als die DB. Andernfalls wäre der Zustand der Anwendung dauerhaft nicht definiert und man könnte überhaupt keine ordentlichen Anwendungen schreiben, weil man nie sichergestellt bekommt das an Daten zu bekommen, was man meint abgefragt zu haben.

Ich weiß nicht was du dir für nen Bock geschossen hast, aber damit hat es nichts zu tun, ebensowenig wie die Erde keine Scheibe ist.


----------



## Bleiglanz (30. Sep 2005)

das mit dem "gleichzeitigen Anschauen" innerhalb von Access ist immer problematisch, probier mal

connection.setAutoCommit(true);

was ich machen würde:

1. preparedStatement verwenden (wegen Date und so)

2. Transaktion verwenden, könnte ja auch irgendwas ganz anderes mittendrin schiefgehen


----------

