# Problem mit jdbc MS Access / nach 670 inserts ist schluss.



## alexpetri (3. Apr 2008)

Hi,

ich muss leider auf einer accesdatenbank arbeiten und hab prompt ein problem.
Ich will eine leere Tabelle mit werten befüllen und immer nach 676 einträgen bricht mein programm mit folgender fehlermeldung ab:

```
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Das Objekt ist ungültig, oder es ist nicht mehr festgelegt.
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
	at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
	at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
	at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
	at application.myDBObject.execute(myDBObject.java:124)
	at application.GPImporter.insertIntoTable(GPImporter.java:151)
	at application.App.main(App.java:38)
```

weis jemand spontan woran das liegen kann? oder soll ich mehr infos liefern?


----------



## alexpetri (3. Apr 2008)

ich habe es jetzt nochmal geprüft mit einer anderen tabelle und anderen werten immer bei 676 datensätzen ist schluss:
rufe ich das ganze programm neu auf gehen wieder nur 676 datensätze rein
*Aufruf:*

```
for (int i = 0; i < 1000; i++) {
			if (i % 500 == 0) {
				db = new myDBObject(
						"src/main/recources/db/meineDB", "access");
				System.out.println(i);
				db.close();
				db = null;
			}
			gpi.updateTable(true, i); //
		}
		db.close();
```
*=> updateTable*

```
public void updateTable(boolean isUpdate, int i) {
		Random r = new Random();		
		sql = "INSERT INTO meineTabelle (integerWert,textFeld) VALUES( "+r.nextInt()+", 'asdasdasd' )";
		db.execute(sql);
		// System.out.println("ok");

	}
```
*=> db.execute()*

```
public int execute(String sql) {
		Statement stmt;
		int ret = 0;
		try {
			stmt = this.con.createStatement();
			ret = stmt.executeUpdate(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return ret;
	}
```
*die connection wird so aufgebaut:*

```
public void connectToMSAccess(String datenbankname) {
		System.out.println("Access DB");
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			this.con = DriverManager
					.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ="
							+ datenbankname + ".mdb");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		sqlDateformat = new SimpleDateFormat("#MM/dd/yyyy#");
	}
```


----------



## foobar (4. Apr 2008)

Du solltest deine Statements und ResultSets sofort wieder schliesen, wenn du diese nicht mehr benötigst. Ansonsten kann es bei manchen DBs zu einer Exception wie "Too many open files" kommen:


```
public int execute(String sql) {
      Statement stmt;
      int ret = 0;
      try {
         stmt = this.con.createStatement();
         ret = stmt.executeUpdate(sql);
      } catch (SQLException e) {
         e.printStackTrace();
      }
      finally
     {
         try
         {
           stmt.close(); 
         }
         catch(SqlException sex)
         {
            sex.printStackTrace();
         }
     }
      return ret;
   }
```


----------



## foobar (4. Apr 2008)

```
for (int i = 0; i < 1000; i++) {
         if (i % 500 == 0) {
            db = new myDBObject(
                  "src/main/recources/db/meineDB", "access");
            System.out.println(i);
            db.close();
            db = null;
         }
         gpi.updateTable(true, i); //
      }
      db.close();
```
Warum schliesst du die Connection alle 500 Datensätze?


----------



## alexpetri (4. Apr 2008)

hey das klappt wunderbar.
wg den 500 datensätzen: das war eigentlich nur ein test ob dies als workaround funktioniert.


----------

