# Zugriff auf MS Access-Datenbank mit jackcess



## fry@linux (16. Apr 2011)

Hallo,
ich suche nach Code-Beispielen um mit jackcess auf eine MDB-Datei zugreifen zu können.
Kann mir jemand helfen?
In der MDB-Datei sind bereits mehrere Tabellen vorhanden, diese möchte ich gerne auslesen und auch Werte in diese Tabellen schreiben.
Ich muss jackcess nutzen, da ich das Programm auch unter Linux nutzen möchte.


----------



## maki (16. Apr 2011)

Let me google that for you

1. Treffer, auf der Homepage von jackcess


----------



## fry@linux (16. Apr 2011)

Hi,
das hatte ich auch gefunden aber irgendwie werde ich daraus nicht schlau. Eine komplettes Beispiel wäre super.


```
import java.io.File;
import java.io.IOException;

import com.healthmarketscience.jackcess.Database;
  
public class Test{

	public static void main(String[] args){
		try {
			System.out.println(Database.open(new File("test.mdb")).getTable("Tabelle").display());
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}
```

dann bekomme ich diesen Fehler:



> Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
> at com.healthmarketscience.jackcess.Database.<clinit>(Database.java:89)
> at Test.main(Test.java:10)
> Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
> ...


----------



## Gast2 (16. Apr 2011)

Dir fehlen libs:

Jackcess - Frequently Asked Questions -> Jackcess - Project Dependencies


----------



## fry@linux (16. Apr 2011)

Danke für den Tipp.
Habe jetzt noch das hinzugefügt: 
import org.junit.*;
import junit.extensions.*;
import junit.framework.*;
import junit.runner.*;
import junit.textui.*;

nun bekomme ich nur noch diese Fehler:


> java.io.IOException: jet format 'VERSION_3' does not support writing
> at com.healthmarketscience.jackcess.Database.open(Database.java:493)
> at com.healthmarketscience.jackcess.Database.open(Database.java:444)
> at com.healthmarketscience.jackcess.Database.open(Database.java:420)
> ...


----------



## fry@linux (18. Apr 2011)

Hi, habe den Fehler gefunden! :toll:

Bei meiner mdb-Datei handelt es sich wohl um eine MS Access 97 - Datenbank!
Nun ist es aber so, dass Jackcess ab Version 1.2.1 diese Dateien unterstützt.

Die Fehlermeldung hat mich dann auf die Idee gebracht. Man muss die mdb explizit "readonly" öffnen.
Da soll einer mal drauf kommen! Man beachte 
	
	
	
	





```
, true
```
 gibt readonly an. :lol: 


```
import java.io.File;
import java.io.IOException;
import com.healthmarketscience.jackcess.Database;
  
public class Test{
 
    public static void main(String[] args) {
    	
    	Object[] DB_table;
		try {
			DB_table = Database.open(new File("01.mdb"), true).getTableNames().toArray();
			for(int i = 0; i<DB_table.length;i++){
				System.out.println(DB_table[i]);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
}
```

Das Beispiel zeigt alle Tabellen in der Datenbank an. Am besten man legt noch eine Textdatei "log4j.properties" an und schreibt dort 
	
	
	
	





```
log4j.rootLogger=OFF
```
 rein, dann gibts keine Meldungen in der Konsole!

PS: Falls jemand weiß, wie man Jackcess doch überreden kann in eine Access97 - Datenbank zu schreiben wäre ich noch glücklicher!


----------



## L-ectron-X (19. Apr 2011)

Die Fehlermeldung sagt doch genau das aus...


> java.io.IOException: jet format 'VERSION_3' does not support writing


...eben dass es nicht geht.

Da kannst du mit Access reden, bis du schwarz wirst, es lässt sich nicht "überreden".


----------



## erdmulch (19. Dez 2011)

Hallo,

hast du schon eine Lösung für dein Datenbank-Problem unter Linux?
ich hab eine Access2003 Datenbank und will mit Eclipse unter einer Linux Umgebung die Daten auslesen
ich habe bereits jackcess1.2.6.jar nach dieser Anleitung eingebunden:
Startup für PostgreSQL + JDBC + Eclipse
ich denke dass es prinzipiell gleich wie bei Postgresql gehen muss!
was mach ich falsch?


```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;


public class MSAccess {

    private final String ODBC_Name = "AccessDB";
    private Connection con;
    private String url;


      public Connection connect()

      {

        try{

            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            System.out.println("Bruecke erfolgreich aufgebaut");
        }catch (ClassNotFoundException e)

        {

            System.out.println("Fehler bei Bruecke");
           JOptionPane.showMessageDialog(null,"Kein Access-Odbc-Treiber gefunden");
        }

        try{
            //url = "jdbc:odbc:" + ODBC_Name;
        	url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" + "DBQ=database/bibliothek/buecher.mdb";
            con = DriverManager.getConnection(url);
            System.out.println("Datenbankverbindung erfolgreich");
        }catch(SQLException s){
           System.out.println("DB-Verbindungsfehler:" + s);
           JOptionPane.showMessageDialog(null,"Datenbankverbindungsfehler");
        }

        

        /*

         *  Alternative Pfadangabe �ber den Direktzugriff

         *  con = DriverManager.getConnection("jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=c:\Server.mdb");

         */
        return con;

      }



      public void close(){

        try {

            con.close();

            System.out.println("Verbindung getrennt");

        } catch (SQLException ex) {

            System.out.println("Fehler beim schlie�en der Verbindung" + ex);

            JOptionPane.showMessageDialog(null, "Probleme beim schlie�en der Verbindung!");
            Logger.getLogger(MSAccess.class.getName()).log(Level.SEVERE, null, ex);

        }

      }

      public static void main(String[] args){
          MSAccess accessDb = new MSAccess();
          accessDb.connect();
          accessDb.close();

      }
}
```


----------



## TheDarkRose (19. Dez 2011)

Blöde Frage, warum verwendet ihr ausgerechnet Access Datenbanken?


----------



## erdmulch (19. Dez 2011)

ganz einfach.
weil ich aus meinem Outlook die Adressdaten in ein Access file exportieren kann.
bzw. gibt es eine Möglichkeit eine csv Datei genauso komfortabel auszulesen?
wenn ja wie?


----------



## HoaX (19. Dez 2011)

CSV kannst du direkt mit HSQLDB oder H2 als Tabelle laden.


----------

