# MS Access und Jarkarta POI



## Chriss_07 (9. Sep 2010)

Ich lasse eine Query über eine Access DB laufen und gebe die Daten in einem Excelsheet aus. Insgesamt 1100 Rows mit 16 Columns.
Dabei stürzt meine JAva SWT Anwendung mit folgender Fehlermeldung ab: 
	
	
	
	





```
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Zusätzliche Tabellen können nicht geöffnet werden.
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
```

Ich habe mir den Durchlauf auch schon im Debug Modus angesehen und dabei festgestellt, dass mein ResultSet die Daten korrekt aufnimmt ( stimmt 100% mit einer Abfrage im SQL Developer überein), dann aber beim füllen des Excelsheets schmiert es ab.
Wenn ich die Query um weitere Einschränkungen erweitere, sodass die Datenmenge nicht mehr so groß wird, klappt der Export.
Kennt jemand ähnliche Probleme mit Access?


----------



## ARadauer (9. Sep 2010)

zeig mal deinen Code.. sieht für mich so aus als gehn dir die Resourcen aus.. zb Datenbank zeiger..

machst du mehrer ResultSets, Statements oder Connections auf?


----------



## Chriss_07 (10. Sep 2010)

Die Query sieht so aus:

```
public List<ExportManager> getDataExport(List<String> aList) throws SQLException {

		List<ExportManager> emList = new ArrayList<ExportManager>();

		try {

			String query = "SELECT * FROM touring WHERE ";

			if (aList.size() > 0) {
				for (int i = 0; i < aList.size(); i++) {
					query += aList.get(i);
					query += " AND ";
				}
			}

			query += "(STRASSE) AND " + "(ORT) AND " + "(PLZ);";

			ResultSet rs = getDb().createQuery(query);

			while (rs.next()) {
				buList.add(new ExportManager(rs));
			}
		} catch (SQLException e) {
			e.printStackTrace();

		}

		return emList;
	}
```

Die DB Connection:

```
public static void main(String[] args) {
	
				new DBConnection();
	
			}
	
	public Connection getInstance() {
		if (conn == null)
			conn = new DBConnection().Connection();
		return conn;
	}
	
	public DBConnection(){
		try {
			conn = DriverManager.getConnection(
					"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="
							+ getDbUrl(), dbUser, dbPW);
			
		} catch (SQLException e) {
		}

	public ResultSet createQuery(String queryString) throws SQLException {
		st = conn.createStatement();
		rs = st.executeQuery(queryString);
		return rs;
	}
	public void commitStatment() throws SQLException {
		conn.commit();
	}
	public void closeDBConnection() throws SQLException {
		conn.close();
	}
	public void closeResultSet() throws SQLException {
		rs.close();
	}
	public void closeStatement() throws SQLException {
		st.close();
	}
}
	}
```

Ja habe eben festgestellt, dass tatsächlich mehrere ResultSets offen sind und kein closeDB gemacht wird.


----------



## Agassiz (29. Nov 2011)

Hi, habe das gleiche Problem, dass ich viele ResultSets öffne.
Ich habe eine Rekursive Funktion, die mir einen Pfad - halt rekursiv - aus der Datenbank ausliest.
Aber ich weis nicht, wo ich die ResultSets die abgelaufen sind, schließen kann.
Kann mir vllt. wer helfen. Hier mein Code:


```
public static String searchUIDParent(String filename, String uid_parent, Connection conn, int magicCounter) {
		System.out.println("Counter: "+magicCounter);
		magicCounter++;
		System.out.println(filename);
		
		String sPath = "";
		String katPath = "";

		if (filename.contains("|||")) {
			String[] paths = filename.split("\\|\\|\\|");
			sPath = paths[0];
			katPath = paths[1];
		} else {
			sPath = filename;
		}
		ResultSet mrs = null;
		try {
			mrs = conn.createStatement().executeQuery("SELECT * FROM main WHERE uid = '" + uid_parent + "' and (type = 1 and subtype = 2)");
			while (mrs.next()) {
				
				if (sPath.contains("|||")) {
					String[] paths = filename.split("\\|\\|\\|");
					sPath = paths[0];
					katPath = paths[1];
				} 

				if (katPath.length() > 0) {
					sPath = searchUIDParent(mrs.getString("filename") + "/" + sPath + "|||" + mrs.getString("caption") + " > " + katPath, mrs.getString("uid_parent"), conn, magicCounter);
				} else {
					sPath = searchUIDParent(mrs.getString("filename") + "/" + sPath + "|||" + mrs.getString("caption"), mrs.getString("uid_parent"), conn, magicCounter);
				}
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		if (katPath.length() > 0) {
			if (!sPath.contains("|||")){
			
			return sPath + "|||" + katPath;
			} else {
				
				return sPath;
			}
			
		} else {
			return sPath;
		}

	}
```

in Zeile 35 wird der gleiche Fehler geworfen:
" java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Zusätzliche Tabellen können nicht geöffnet werden. "


----------



## Agassiz (29. Nov 2011)

Ich mache das ganze jetzt so, dass ich die MS Access Datenbank einmal einlese und dann java intern weiterverarbeite. Shice auf sql!


----------

