# Problem bei Zugriff auf Access Datenbank



## Thohei (14. Jul 2010)

Hallo,

Ich veruche eine Connection auf eine Access DB zu machen.

Connection:

```
public MdlDB() {
	        String[] props = Utils.getDBProps();
	        try {
	        	driver = "org.postgresql.Driver";
                url_beg = "jdbc:postgresql://";
                dbPort = "5432";
                dbHost = props[0];
                dbName = props[1];
                dbUser = props[2];
                dbPwd = props[3];
                driverOdbc = "sun.jdbc.odbc.JdbcOdbcDriver";
                url_odbc = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
                dbNameOdbc = "Journal.mdb";
                dbFolder = props[4];
                
                if(checkPgHost() == true) {
                	this.pgConnect(driver, url_beg, dbHost, dbUser, dbPwd, dbName, dbPort);
                } else {
                	this.odbcConnect(driverOdbc,url_odbc,dbFolder,dbNameOdbc);
                }
	        } catch (Exception ex) {
	        	
	        }
	 }

public void odbcConnect(String driver, String url_beg, String folder, String dbName) {
		 try {
			 Class.forName(driver).newInstance();
			 url = "" + url_beg + "" + folder + "\\" + dbName + ";";
			 conn = DriverManager.getConnection(url,"","");
		 } catch (Exception e) {
			 e.printStackTrace();
		 }
	 }
```

Dann möchte ich eine Abfrage ausführen.

Diese über diese Funkion ausgeführt wird:

```
public ResultSet executeOdbcQuery(String query) {
    	try {
    		Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
    		return stmt.executeQuery(query); //Das ist Zeile 100;
    	} catch (SQLException se) {
    		System.out.println(se.getSQLState());
    		se.printStackTrace();
            JOptionPane.showMessageDialog(null, se, "Fehler in der Abfrage!", JOptionPane.ERROR_MESSAGE);
    	}
    	return null;
    }
```

Und dann kommt dieser Fehler.

Fehler:

```
java.sql.SQLException: General error
	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)
	at sun.jdbc.odbc.JdbcOdbcResultSet.calculateRowCount(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcResultSet.initialize(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.getResultSet(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
        at waitzrichter.MdlDB.executeOdbcQuery(MdlDB.java:100)
	at waitzrichter.MyTableView.getTableData(ViewUebersicht.java:72)
	at waitzrichter.MyTableView.<init>(ViewUebersicht.java:18)
	at waitzrichter.ViewUebersicht.<init>(ViewUebersicht.java:244)
	at waitzrichter.ViewWaitzRichter.addComponentsToPane(ViewWaitzRichter.java:15)
	at waitzrichter.ViewWaitzRichter.createAndShowGUI(ViewWaitzRichter.java:110)
	at waitzrichter.ViewWaitzRichter.access$0(ViewWaitzRichter.java:102)
	at waitzrichter.ViewWaitzRichter$2.run(ViewWaitzRichter.java:125)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Ich habe nun schon einiges ausprobiert, finde aber keine Lösung.


----------



## L-ectron-X (14. Jul 2010)

Naja, du vermischst offenbar PostgeSQL mit Access. Das funktioniert nicht. Entscheide sich für eine DB und einen Treiber.


----------



## Thohei (14. Jul 2010)

Das ist auch so gewollt.

Die Access Verbindung wird nur benutzt wenn der Postgre nicht online ist.

Die Tabellen die auf dem Postgre liegen, werden in Access Datenbanken exportiert.

Da die Postgre DB im lokalen Firmennetz ist und unsere Mitarbeiter aber teilweise Projekte vor Ort ändern müssen. Deshalb werden die Projekte in Access DBs exportiert.

Ich habe ja noch eine Funktion die prüft ob der Postgre online ist oder nicht:

```
public boolean checkPgHost() {
    	Socket pgSocket = null;
    	BufferedReader in= null;
    	
    	try {
    		pgSocket = new Socket(this.dbHost,Integer.parseInt(this.dbPort));
    		in = new BufferedReader(new InputStreamReader(pgSocket.getInputStream()));
    		in.close();
    		return true;
    	} catch (UnknownHostException e ) {
    		//e.printStackTrace();
    		return false;
    	} catch (IOException e ) {
    		//System.err.println ( "Couldn't get I/O for the connection to: taranis." ) ;
    		return false;
    	}
```


----------



## L-ectron-X (14. Jul 2010)

Dann schau dir zunächst mal an, wie du eine Verbindung zur Datenbank herstellst und vergleiche sie mit dieser hier: Datenbankverbindung (Java) - Byte-Welt Wiki


----------



## Thohei (14. Jul 2010)

Fehler gefunden!

Die Abfrage ist anscheinend zu komplex.

Das ist die eigentliche Abfrage:
[Java]
sql = "SELECT tj.jj_nr, tj.jj_bezchg, tj.jj_vfibu, tj.jj_statistik, tj.jj_verw, tj.jj_abschl, tj.jj_inso_vorl, " +
	        "tj.jj_aktenzeichen, tj.jj_bildarchiv, tj.jj_saved, tj.jj_update, tj.jj_auftrag, " +
	        "(SELECT tag.ja_a1 FROM tj_ag tag WHERE tag.ja_nr = tj.jj_ag) AS kdnr, " +
	        "(SELECT tag.ja_kurzbez FROM tj_ag tag WHERE tag.ja_nr = tj.jj_ag) AS kunde, " +
	        "(SELECT tp.lp_name FROM tl_personal tp WHERE tp.lp_id = tj.jj_sv) AS supervisor, " +
	        "(SELECT tp.lp_name FROM tl_personal tp WHERE tp.lp_id = tj.jj_pl) AS projectmanager FROM tj_journal tj ORDER BY tj.jj_nr ASC;";
[/code]

Mit einer "SELECT * FROM tj_journal" geht es.

Also ist der Connect richtig und die Query Funktion auch.

Jetzt habe ich wenigsten schonmal einen Ansatz.


----------



## Marcinek (14. Jul 2010)

Ich würde dir zur optimierung deiner SQL zu crossjoins oder generell joins raten.

Diese subquerys da sind unmöglich.

Gruß,


Martin


----------



## Thohei (16. Jul 2010)

So habe das ganze jetzt mit JOINs gemacht, obwohl es bei einer Sache nicht funktioniert.


```
sql = "SELECT tj.jj_nr, tj.jj_bezchg, tj.jj_vfibu, tj.jj_statistik, tj.jj_verw, tj.jj_abschl, tj.jj_inso_vorl, " +
            "tj.jj_aktenzeichen, tj.jj_bildarchiv, tj.jj_saved, tj.jj_update, tj.jj_auftrag, tag.ja_a1 AS kdnr, tag.ja_kurzbez AS kunde, " +
            "tp.lp_name AS supervisor, tp.lp_name as projectmanager " +  // DAMIT KOMMT ER NICHT KLAR, da wird mir bei Supervisor und projectmanager immer derselbe angezeigt, obwohl es unterschiedliche sind.
            "LEFT JOIN tj_ag tag ON tag.ja_id = tj.jj_ag " +
            "LEFT JOIN tl_personal tp ON tp.lp_id = tj.jj_sv AND tp.lp_id = tj.jj_pl " +
            "FROM tj_journal tj ORDER BY tj.jj_nr ASC;";
```


----------



## Thohei (16. Jul 2010)

So mit diese Abfrage funktioniert es sowaohl unter postgresql und access.


```
sql = "SELECT tj.jj_nr, tj.jj_bezchg, tj.jj_vfibu, tj.jj_statistik, tj.jj_verw, tj.jj_abschl, tj.jj_inso_vorl, " +
	        "tj.jj_aktenzeichen, tj.jj_bildarchiv, tj.jj_saved, tj.jj_update, tj.jj_auftrag, tag.ja_a1 AS kdnr, tag.ja_kurzbez AS kunde, " +
	        "tp.lp_name AS supervisor, tpl.lp_name AS projectmanager " +
	        "FROM ((tj_journal tj " +
	        "LEFT JOIN tj_ag tag ON tag.ja_nr = tj.jj_ag) " +
	        "LEFT JOIN tl_personal tp ON tp.lp_id = tj.jj_sv) " +
	        "LEFT JOIN tl_personal tpl ON tpl.lp_id = tj.jj_pl " +
	        "ORDER BY tj.jj_nr ASC;";
```


----------

