# Relationstabelle will nicht



## technics1210 (23. Mai 2004)

Also, es gibt 3 Tabellen: Kunden, Rechnung, nKundeRechnung

Jede Rechnung ist eindeutig, jeder Kunde kann mehrere Rechnung besitzen. diese Zuweisungen wollte ich in nKundeRechnung festlegen.

nKundeRechnung hat 3 Datenfelder (Autowert, KundeID, RechnungID)

Will ich jetzt per INSERT Kommando einen vorhanden Kunden einer vorhandenen (noch nicht zugewiesenen) Rechnung zuweisen so bekomme ich zwar keine Fehlermeldung, allerdings passiert nichts.


```
Connection con;

               con = DriverManager.getConnection("jdbc:odbc:Haircut","","");
               Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
               
               query ="INSERT INTO nKundeRechnung (KundeID, RechnungID) VALUES('"+kundeID+"','"+rechnungID+"')";
               
               stmt.executeUpdate(query);
```

executeUpdate() liefert den Wert 1 zurück, Programm schmeißt keine Exception, die Tabelle ändert sich nicht.


PS: Datenbank ist Access


----------



## nollario (24. Mai 2004)

aaalso:

da es sich um eine sogenannte constraint violation handelt von der du da sprichst, wundert es mich, dass du keine exception erhälst... kannst du evtl mal den kompletten code hier posten?

leider habe ich hier keine access datenbank laufen (gott bewahr), bei sybase und mysql hagelt es allerdings bei ähnlich aufgebauten beispielen exception mit einer eindeutigen fehlermeldung: "foreign key violation", "duplicate key row"...

wäre schliesslich auch ein jammer wenn jdbc das nicht tun  würde!


----------



## Guest (24. Mai 2004)

könntest du mir eventuell verraten, wie das ganze den geschickter gelöst wird? 

also original schaut das so aus


```
public static void nKundeRechnung(int kundeID, int rechnungID){
        try{
               Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           }
        catch(ClassNotFoundException e) { 
               System.out.println ("ClassNotFoundException");
           }

        try{
               Connection con;

               con = DriverManager.getConnection("jdbc:odbc:Haircut","","");
               Statement stmt = con.createStatement();
               
               query ="INSERT INTO nKundeRechnung(Kunde_ID, Rechnung_ID)VALUES('"+kundeID+"','"+rechnungID+"')";
               
               stmt.execute(query);
           }
        catch(SQLException e){ 
               e.printStackTrace();
           }
    }
```

trage ich das ganze per hand ein in die access tabelle funktioniert es


----------



## technics1210 (24. Mai 2004)

nochwas:

schließe ich mein Statement und meine Connection zum Schluss, bekomme ich folgende Fehlermeldung:

```
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Ungültiger Transaktionsstatus.
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
        at sun.jdbc.odbc.JdbcOdbc.SQLDisconnect(JdbcOdbc.java:3034)
        at sun.jdbc.odbc.JdbcOdbcDriver.disconnect(JdbcOdbcDriver.java:981)
        at sun.jdbc.odbc.JdbcOdbcConnection.close(JdbcOdbcConnection.java:739)
        at ConnectDB.nKundeRechnung(ConnectDB.java:341)
        at test.main(test.java:23)
```


----------



## nollario (24. Mai 2004)

eigentlich sieht das in ordnung aus....

der fehler sollte eigentlich nur auftauchen wenn die Connection nicht auf AutoCommit = true steht, d.h. du musst manuell commit bzw. rollback aufrufen.

hm....

echt seltsam... kannst ja mal versuchen, indem du nach erzeugung der connection sagst: con.commit();


----------



## technics1210 (24. Mai 2004)

ich danke dir - das wars schlussendlich. mein ursprünglicher fehler war anscheinend, dass ich die close() anweisungen ausgelassen hab, allerdings blieb mir jetz vom herumtesten  ein autocommit(true) übrig. Das blöde Problem hat mich jetz sicher 6 Stunden gekostet =)

merci


----------

