MsAccess immer beim zweiten Update java.sql.SQLException

Status
Nicht offen für weitere Antworten.

Kaffeebohne

Bekanntes Mitglied
Hallo,

ich versuche Daten in eine MSAccess mdb zu schreiben.

Zuerst hole ich alle Daten, dann verarbeite ich diese in einer Schleife in der ich das Ergebnis wieder reinschreibe.


Jedesmal beim 2. Update bekomme ich eine Exception
Code:
java.sql.SQLException: General error
        at sun.jdbc.odbc.JdbcOdbc.throwGenericSQLException(JdbcOdbc.java:7087)
        at sun.jdbc.odbc.JdbcOdbc.SQLAllocStmt(JdbcOdbc.java:174)
        at sun.jdbc.odbc.JdbcOdbcConnection.createStatement(JdbcOdbcConnection.java:413)
        at sun.jdbc.odbc.JdbcOdbcConnection.createStatement(JdbcOdbcConnection.java:396)
        at database.MSAccess.getStatement(MSAccess.java:73)

Ich weiss nicht warum, weil ich auch darauf achte nur eine Instantz zu öffen -> Singleton

Code:
public class MSAccess {
    
    protected static DatabaseDSN dsn = null;
    protected static Connection con = null;
    protected static MSAccess instance = null;


    
    /** Creates a new instance of MSAccess */
    protected MSAccess() {
    
    }

    public static void setDSN(DatabaseDSN d) {
        dsn = d;
    }
    
    protected void connect() throws SQLException {
        Messenger.send("Connecting to database: " + dsn.url);
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        } catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + dsn.url, dsn.user, dsn.password);
    }
    
    public Connection getConnection() throws SQLException {
        checkConnnection();
        return con;
    }
    
    public void close() throws SQLException {
        Messenger.send("Trying to close the connection with database: " + dsn.url);
        if(con != null) con.close();
    }
    
    protected void checkConnnection() throws SQLException {
         if(con == null) {
            System.out.println("MSAccess connection was null");
            connect();
        } else {
            
            System.out.println("MSAccess connection IS OKAY");
        }
    }
    
    
    public static MSAccess getInstance() {
        if(instance == null) instance = new MSAccess();
        return instance;
    }
    
    

    
    public Statement getStatement() throws SQLException {
        checkConnnection();
        return con.createStatement();
    }
    

    public Statement getStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
        checkConnnection();
        return con.createStatement(resultSetType, resultSetConcurrency);
    }
}
 

SamHotte

Top Contributor
Der 'general error' wird bei mir meistens dann von Access geschmissen, wenn es den Primärschlüssel schon gibt. Fügst du vielleicht zweimal dasselbe ein?
 

Kaffeebohne

Bekanntes Mitglied
Leider nein - es knallt schon vorher.

In dem Moment wo ich (msAccessObj ist ein Objekt von MSAccess):
msAccesObj.getStatement

aufrufe wirft er die Exception.

PS. Es ist ein update das ich ausführe, aber wie gesagt es kommt gar nicht so weit :(
 

SamHotte

Top Contributor
Hmm, ohne die Code-Zeile 73 (in der der Error geschmissen wird) ist es schwierig - poste bitte mal den Code, wo du die DB initialisierst.
 

Kaffeebohne

Bekanntes Mitglied
Die Zeile 73 ist in der Klasse MSAccess ist hier im Code die Zeile 60.


Der Teil des Codes der das aufruft ist:

Code:
class ShipmentDAO {
MSAccess con = null;
    public ShipmentDAO() {
        con = MSAccess.getInstance();
    }
.....
   public void update(Shipment shipment) throws SQLException {
        String sql = 
                "UPDATE data.... sql Zeugs;
        System.out.println(sql);
       
        Statement state = con.getStatement();
        state.executeUpdate(sql);
        state.close();
    }

}

Die Exception wird hier in Zeile 13 verursacht.
 

SamHotte

Top Contributor
Irgendwie kommst du da mit den Typen durcheinander, glaube ich. In deinem letzten Codefragment (class ShipmentDAO) müsste con vom Typ MSAccess sein, wenn du es über '.getInstance()' instantiierst - für das Statement brauchst du aber ein Connection-Objekt. Probier doch mal, ob es so geht:
Code:
MSAccess db = MSAccess.getInstance();
Connection con = db.getConnection();
Statement st = con.getStatement();
...
 

Kaffeebohne

Bekanntes Mitglied
Hmm,

ich glaube ich habe den Fehler entdeckt:

Er ist in der ShipmentDAO - da habe ich noch eine Methode:

Code:
    protected void finalize() throws Throwable {
        con.close();
    }

Seit ich die Rausgenommen habe gehts.

Nur ich habe einen anderen komischen Seiteneffekt.

Es fehlt jetzt immer der letzte SQL-Befehl, obwohl er gesendet wird.

Als Test habe ich eine Tabelle erstellt mit ID PrimaryKey Autoincrement und eine Spalte foo Text

Code:
        String url = "c:\test.mdb";
        DatabaseDSN dsn = new DatabaseDSN();
        dsn.url = url;

       

        MSAccess ms = MSAccess.getInstance();
        ms.setDSN(dsn);
        try {
            Statement s = ms.getStatement();
            for(int i = 0; i < 10; ++i)
                s.execute("INSERT INTO testtab (foo) VALUES ('TEST')"); 
        }catch (SQLException se) {
            se.printStackTrace();
        }

Eingetragen werden aber nur neun. Auch bei Updates ist das so.

Irgendjemand eine Idee?[/code]
 

Kaffeebohne

Bekanntes Mitglied
Morgen Sam,

ich habe gerade den Post geschrieben als du geantwortet hast *fg*


Hmm, als con ist doch bei mir vom Typ MSAccess - ist in der Klasse ShipmentDAO eine Membervariable. Werde deinen Vorschlag trotzdem gleich mal ausprobieren.
 

SamHotte

Top Contributor
Moin :)

Stimmt, hatte ich übersehen - war verwirrt, weil ich immer meine Connections mit 'con' bezeichne ...

Gib mal Bescheid, ob es funzt.
 

Kaffeebohne

Bekanntes Mitglied
Hmm,

also ich hab gerade nochmal überlegt. Was anderes mache ich in meiner MSAccess Klasse auch nicht nur das ich "Connection.con.createStatement" mache und du "Connection.con.getStatement", geht aber nicht da die Methode nicht vorhanden ist - denke aber du meinst createStatement
 

SamHotte

Top Contributor
Jo, meinte ich. Du hattest doch so eine 'getStatement()'-Methode selbst in deinem Post von 9:50 Uhr :bahnhof:
 

Kaffeebohne

Bekanntes Mitglied
Stimmt ich hole mir über ein MSAccess Objekt über die Methode getStatement ein Statement Objekt, dass aber in der Klasse MSAccess unter zuhilfennahme des Connection Objekts mit der Methode createStatement erzeugt wird.

Hoffe das ist jetzt nicht zu unverständlich :D


Sam, könntest du eventuell eine Testdatenbank testtab in Access erzeugen mit ID, Primary Key, Autowert und einer Spalte foo, Text und testen ob bei dir auch der letzte SQL-Befehl nicht ausgeführt wird?

Ich kapier das Momentan echt nicht warum das nicht funktioniert. Es wird auch keine Exception geworfen. :?
 

Kaffeebohne

Bekanntes Mitglied
Also ich glaube es gibt so eine Art Puffer, weil wenn ich nochmal ein unsinniges SQL-Statement reinhaue was nicht erfüllt werden kann gehts.

Demnach müsste es sowas wie ein Flush geben mit dem man den Puffer leermachen kann. ???
 

SamHotte

Top Contributor
welche Klassen brauche ich - die MSAccess von oben stimmt noch?
editauf jeden Fall brauche ich deine 'DatabaseDSN'
 

Kaffeebohne

Bekanntes Mitglied
Code:
package database;

public class DatabaseDSN {
    
    public String url      = "";
    public String database = "";
    public String user     = "";
    public String password = "";
    
    
    /** Creates a new instance of DatabaseDSN */
    public DatabaseDSN() {
    }
    
}

Ist eingentlich nur so eine Art Struct (C++), aber ich fasse immer Daten zusammen die meiner Meinung nach zusammengehören, da HashMaps oder Strings mir bei solchen sachen zu "unsicher" sind.
 

Kaffeebohne

Bekanntes Mitglied
Ich weiss, aber es geht mir nur darum das wenn ich z.B. eine HashMap, Array oder sowas einer Methode übergeben würde nicht sichergestellt ist, dass auch alle Felder vorhanden sind. So kann ich auch Defaultwerte setzen. Sicherlich könnte man noch über setter eine Validation einerführen, aber das ist bei reinen "Datentypen" imho übertrieben.
 

SamHotte

Top Contributor
Mit kleinen Änderungen funzt es bei mir (aber nur, wenn die DB in Access nicht geöffnet ist):
Code:
import java.sql.SQLException;
import java.sql.Statement;

public class TestMsAccess
{

  public static void main (String[] args)
  {
    String url = "c:\\test.mdb";
    DatabaseDSN dsn = new DatabaseDSN();
    dsn.url = url;

    MSAccess ms = MSAccess.getInstance();
    Statement s = null;
    ms.setDSN(dsn);
    try {
      s = ms.getStatement();
      for (int i = 0; i < 10; ++i)
        s.execute("INSERT INTO testtab (foo) VALUES ('TEST')");
    }
    catch (SQLException se) {
      se.printStackTrace();
    }
    finally {
      try {
        s.close();
      }
      catch (SQLException exception) {
        exception.printStackTrace();
      }
    }

  }

}

edit hmm... ist das Absicht, dass er 9 Datensätze einbaut?
 

Kaffeebohne

Bekanntes Mitglied
Also ich habe jetzt das Ding auch mal probiert bei mir werden aber nur 9 Datensätze geschrieben. Sind es bei dir wirklich 10?
 

Kaffeebohne

Bekanntes Mitglied
Precrement zählt einmal weniger, hmm -


Code:
        System.out.println("Precrement");
        for(int i = 0; i < 10; ++i)
            System.out.println(i);
        System.out.println("Postcrement");
        for(int i2 = 0; i2 < 10; i2++)
            System.out.println(i2);

Also beides mal kommt bei mir 9 raus plus die 0 gibt 10 :cool: (9+0=10 hihi - so isses net gemeint)
 

SamHotte

Top Contributor
Dann hab ich nen Denkfehler - und die Datenbank verschluckt einen Datensatz. Vielleicht muss man die Connection auch noch schließen ... hmm, nicht gut.
 

SamHotte

Top Contributor
Jepp. Baue die finally-Klammer so:
Code:
    finally {
      try {
        s.close();
        ms.close();
      }
      catch (SQLException exception) {
        exception.printStackTrace();
      }
    }
 

Kaffeebohne

Bekanntes Mitglied
Danke für den Tip. :toll: :D

Was mich aber wundert: Was ähnliches hab ich mir ja auch gedacht, bei der ShipmentDAO finalize Methode. Also die Verbindung wieder zu schliessen, wenn das Objekt zerstöhrt wird. Nur da gabs ja den Fehler mit dem der Thread angefangen hat.

Finalize ist doch der "Destructor" oder?
 

SamHotte

Top Contributor
Jein - finalize wird zwar vom GC aufgerufen, aber du kannst nicht steuern, wann - daher besser selbst machen.
 

SamHotte

Top Contributor
Kann auch passieren; verlassen kann man sich jedenfalls nicht auf ihn, daher würde ich gerade sowas wie Datenbankverbindungen selbst managen. Wird eigentlich auch in allen Beispielen so gemacht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Keine ODBC-Verbindung zur MSAccess-Datenbank Datenbankprogrammierung 2
G Applet und MsAccess Datenbankprogrammierung 2
S Java SQL-Exception bei Zugriff auf MSAccess Datenbankprogrammierung 2
R Mongodb Daten werden immer überschrieben Datenbankprogrammierung 7
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
J MySQL Verbindung über JDBC scheitert immer Datenbankprogrammierung 2
C Metadata der SessionFactory immer null Datenbankprogrammierung 2
DStrohma MS SQL Server 2005 + Java: Immer nur eine aktive Verbindung erlaubt? Datenbankprogrammierung 5
M Datenbankentwurf: Immer das gleiche Problem! Datenbankprogrammierung 7
J SqlConnection Instanz wird immer grösser? Datenbankprogrammierung 2
Z MySQL Tabelle immer leer Datenbankprogrammierung 5
J Anzeige Button gibt immer nur 1. Datensatz aus DB aus Datenbankprogrammierung 8
B Datenbank Abfrage: Es fehlt immer ein Eintrag! Datenbankprogrammierung 7
G ich bekomm immer die exception grrrr Datenbankprogrammierung 3
Kirby.exe Verwirrung beim Query Datenbankprogrammierung 4
Z Beim schließen des Programms die verbindung zur DB beenden. Datenbankprogrammierung 4
C Oracle Fehler beim list.add() Datenbankprogrammierung 5
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
H Brauche Hilfe beim Mappen von 3 Tabellen a 1:n mit hbm.xml. Datenbankprogrammierung 34
J Java Eclipse Hilfe beim Programmieren Datenbankprogrammierung 7
B JPA->fehler beim Insert in die Datenbank Datenbankprogrammierung 3
V Fehler beim Generierung Fehler beim Generierung java.lang.ArrayIndexOutOfBoundsException: 0 Datenbankprogrammierung 12
H HSQLDB Beim öffnen folgender Fehler: ... java.lang.NullPointerException Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
ruutaiokwu sql server werte swappen beim update-vorgang mit unique-constraints..? Datenbankprogrammierung 2
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
M MySQL probleme beim "Generate Tables from Entities" Datenbankprogrammierung 9
T MySQL Multithreading beim Datenbankzugriff Datenbankprogrammierung 3
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
J Datentyp der Spalte beim Datenbankdesign unbekannt Datenbankprogrammierung 12
S Derby/JavaDB Probleme beim anlegen einer embedded DB Datenbankprogrammierung 13
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
N HSQLDB Problem beim Treiberladen im Jar Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
M Datenbankverbindung zu langsam beim Insert? Datenbankprogrammierung 6
Paristick MSSQL - JDBC Exception beim Registrieren Datenbankprogrammierung 5
D JDBC Fehler beim laden der nativen Bibliothek db2jcct2 Datenbankprogrammierung 9
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2
T Problem beim schreiben von daten Datenbankprogrammierung 4
S MySQL generelles vorgehen beim connect zu entfernter datenbank Datenbankprogrammierung 3
A Derby/JavaDB Probleme beim Einbinden Datenbankprogrammierung 2
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
J MySQL Hibernate: Probleme beim Speichern von OneToMany - Datensätzen Datenbankprogrammierung 2
X Vector Verhalten beim DataModel seltsam Datenbankprogrammierung 6
D MySQL Problem beim einfügen von Double-Zahlen Datenbankprogrammierung 4
U MSSQL Verbindung steht, aber meckert beim Statement Datenbankprogrammierung 2
N Probleme beim Aufruf aus der DB Datenbankprogrammierung 7
cosmic Problem beim Update einer Oracle DB Datenbankprogrammierung 7
T Problem beim Update in die Access DB Datenbankprogrammierung 9
F SQLException fangen beim verbinden mit Hibernate Datenbankprogrammierung 17
M Problem beim Importieren einer Datenbank Datenbankprogrammierung 3
C Datenumwandlungsfehler beim Umwandeln Datenbankprogrammierung 4
S Fehler beim Auslesen von Daten Datenbankprogrammierung 6
V Probleme beim Öffnen "einiger" SuperbaseTabellen p Datenbankprogrammierung 8
G Probleme beim Methodenaufruf einer EJB Datenbankprogrammierung 10
H Beim insert bekomme ich den Fehler missing select keyword Datenbankprogrammierung 2
V Fehlermeldung beim Insert Datenbankprogrammierung 16
G beim lesen der db alte daten bekommen? Datenbankprogrammierung 5
A Problem beim Laden des Treibers Datenbankprogrammierung 5
A Fehler beim Starten des Servers für H2 Database Datenbankprogrammierung 13
A Probleme beim Schreiben in eine CSV-Datei aus einer H2-DB Datenbankprogrammierung 2
G Problem beim einfügen in der Datenbank Datenbankprogrammierung 4
G Problem beim Schreiben eines Dateipfads in MySQL-DB Datenbankprogrammierung 9
J OutOfMemory beim Clob Datenbankprogrammierung 5
D An Access Datenbank andocken ohne sie beim System anzumelden Datenbankprogrammierung 3
M "SQL - Apache" Problem beim laden des Applets Datenbankprogrammierung 4
J Fehlermeldung beim ausführeren dieses Befehles Datenbankprogrammierung 5
G Fehler beim Verbinden Datenbankprogrammierung 4
D Problem beim Zugriff auf eine Oracle-DB Datenbankprogrammierung 23
A Datenbankzugriff per Applet - Problem beim Treiber laden Datenbankprogrammierung 6
E Problem beim laden des JDBC Driver bzw der Database Datenbankprogrammierung 8
M Daten von MySQL nach MSSql probleme beim schreiben Datenbankprogrammierung 3
S JDBC-Anfänger und Probleme beim Treiberfinden etc. Datenbankprogrammierung 4
T Probleme beim Verbindungsaufbau zum SQL 2000 Datenbankprogrammierung 2
P Wie Usernamen beim Einloggen für Combobox übernehmen?HELP Datenbankprogrammierung 2
N Fehler beim matchen von Strings via Query Datenbankprogrammierung 2
T Problem beim Update vom Resultset + Firebird Datenbankprogrammierung 2
R JDBC: Resultset beim Thema MEZ&MESZ Datenbankprogrammierung 12
J Fehler beim PreparedStatement Datenbankprogrammierung 2
P Fehlermeldung beim Erstellen einer neuen Tabelle Datenbankprogrammierung 2
M Problem beim erstellen der DB Datenbankprogrammierung 3
G Problem beim Zugriff SQL 2000 Datenbankprogrammierung 2
6 Hilfe beim Einstieg Datenbankprogrammierung 15
A ClassNotFoundException beim Laden des Oracle-JDBC-Treibers Datenbankprogrammierung 10
A Fehler beim Verbinden zur Oracle-DB Datenbankprogrammierung 6
G Rundungsfehler beim Lesen von Fliesskommazahlen... Datenbankprogrammierung 2
K Problem beim Einlesen von Werten aus einem Textfeld Datenbankprogrammierung 11
V Exception beim Speichern von eingegebenen Daten in Tabelle Datenbankprogrammierung 2
W Fehlermeldung beim Ändern einer jdbTable Datenbankprogrammierung 5
G Fehlermeldung beim Zugriff auf SQL-Server-DB Datenbankprogrammierung 3
E Problem beim Datenbank-Design (relational) Datenbankprogrammierung 10

Ähnliche Java Themen

Neue Themen


Oben