Tutorial: Access-Datenbank-Zugriff mit Java programmieren

Eine neue Datenbank mit Access zu bauen, ist nicht sehr schwer. Aber Access als Benutzeroberfläche für die Anwender? Das scheitert meist an zu wenig vorhandenen Installationen des Programms.
Also: Warum nicht eine eigene, schlanke Benutzeroberfläche programmieren, die ohne Access direkt auf die mdb-Datei zugreift? Der Aufwand ist nicht groß, wenn man es mal erfolgreich ausprobiert hat. Und die Kosten für Softwarelizenzen liegen bei Null!
In diesem Tutorial werden die grundlegenden Schritte für ein einfaches Frontend beschrieben.

Was wird benötigt?

  1. Java JDK und eine Entwicklungsumgebung, in diesem Tutorial verwenden wir JDK 5.0 und NetBeans 5.5 (zur Download-Seite).
  2. Eine Access-Datenbank-Datei. Die kann man selbst erstellen oder für dieses Tutorial herunterladen.

Vorbereitungen
Wir gehen in diesem Tutorial davon aus, dass die Datenbank-Datei "kontakte.mdb" heißt und im Verzeichnis "C:\tutorial\" liegt (für den gemeinsamen Zugriff durch mehrere Anwender könnte man ebenso ein Netzlaufwerk verwenden). Die Datenbank enthält eine Tabelle "adressen" mit folgenden Spalten:
ID (Primärschlüssel, wird automatisch hochgezählt), Vorname, Nachname, Straße, PLZ, Ort, Telefon, Telefax, Geburtsdatum.

Bevor es mit der Programmierung losgeht, können wir mit NetBeans einen Blick in die Datenbank werfen und auch schon SQL-Befehle ausführen. Dazu klickt man auf den Reiter "Runtime", dann mit der rechten Maustaste auf "Databases", dort auf den Befehl "New Connection...". Diese Eingaben sind nun erforderlich:
Name: JDBC-ODBC-Bridge
Driver: sun.jdbc.odbc.JdbcOdbcDriver
Database URL: jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/tutorial/kontakte.mdb

Wichtig: Bei der Pfadangabe zur Datenbank keine Backslashes (\), sondern Slashes (/) verwenden!

Die Felder "User Name" und "Password" bleiben in diesem Fall leer. Die Option "Remember Password during this session" kann markiert werden.

Nach einem Klick auf "OK" erscheint nun eine Warnung "Unable to obtain schema", die wir getrost ignorieren können. Wenn im nachfolgenden Dialog "Connection established" steht, ist alles in Ordnung!

Nun wollen wir einen ersten Versuch mit einer Datenbank-Abfrage unternehmen. Mit der rechten Maustaste klickt man auf den neuen Eintrag "jdbc:odbc:..." unter "Databases" und wählt "Execute Command...". Im neu geöffneten Fenster "SQL Command 1" geben wir

SELECT * FROM adressen


ein und klicken auf den Button "Run SQL".

Nun sollte der gesamte Inhalt der Datenbank zu sehen sein: Zwei komplett ausgefüllte Adresszeilen.

Die Datenbank-Ansicht ist sehr praktisch, um Feldnamen (bzw. Spaltennamen) und aktuelle Inhalte nachzusehen oder um eigene SQL-Befehle auszuprobieren. Für die weiteren Schritte in diesem Tutorial brauchen wir sie aber nicht mehr. Deshalb beenden wir die Datenbankverbindung mit einem Rechte-Maustaste-Klick auf den "jdbc:odbc:..."-Eintrag und dem Befehl "Disconnect". Dann klicken wir auf den Reiter "Projects" und starten mit der Programmierung!

Seiten: 1· 2· 3

14 Kommentare

Kommentar von: Helmut Rieke [Besucher]
Helmut Rieke

Guten Tag - ich versuche mich kurz zu fassen.
Ich habe als Lehrer ( weiß alles, aber von nix alles) eine Access-Datenbank gebastelt, die auch andere Schulen brauchen können. Access hat keiner, viele Schulen arbeiten noch mit WIN2000, so dass die kostenlose runtime von MS auch nix bringt. Nun stoße ich auf Ihre Lösung, habe aber von JAVA null Ahnung. Auf welcher Oberfläche muss ich Ihren Access-Zugriff basteln? Für ein paar tipps wäre ich sehr dankbar!
mfg
Rieke

16.05.08 @ 09:07
Kommentar von: jrt [Mitglied]  
jrt

Hallo Herr Rieke,

die Java-Lösung, die ich hier beschreibe, ist eher etwas für (Hobby-)Programmierer, die sich eine Benutzeroberfläche komplett selbst bauen möchten. Für Sie wäre es sicher praktischer, Ihre Access-Datenbank mit einer OpenOffice-Benutzeroberfläche auszustatten. Das ist ziemlich einfach, kostet nichts und läuft auch unter Windows 2000. Man braucht dann weder das Access-Progamm noch die Access Runtime Engine. OpenOffice ist ziemlich weit verbreitet und dürfte auch in Schulen beliebt sein.

OpenOffice finden Sie unter http://download.openoffice.org

Nach der Installation starten Sie “OpenOffice Base". Im Datenbank-Assistent wählen Sie “Verbindung zu einer bestehenden Datenbank herstellen” und im Klappmenü darunter “Microsoft Access". Nach einem Klick auf “Weiter” können Sie den Speicherort der vorhandenen Access-Datenbank angeben. Mit “Fertig stellen” bekommen Sie einen Speichern-Dialog für die neue OpenOffice-Benutzeroberfläche. Wählen Sie am besten das gleiche Verzeichnis wie die Access-Datei.

Die OpenOffice-Datei (odf) ist nun mit der Access-Datei verbunden und erlaubt den Zugriff auf alle Tabelleninhalte. Sie können in OpenOffice Base ganz ähnlich wie in Access Abfragen, Formulare und Berichte erstellen. Allerdings sind die Daten weiterhin in der Access-Datei enthalten, diese darf also nicht gelöscht werden. Wenn Sie Ihre Datenbank auf anderen PCs nutzen möchten, dann müssen Sie beide Dateien zusammen dorthin kopieren. Und OpenOffice muss dort natürlich auch installiert sein.

Damit die OpenOffice-Datei die Access-Datenbank auf anderen PCs problemlos wiederfindet, sollte der Speicherort immer gleich sein, z.B. “C:\Programme\IhrDatenbankName". Wenn OpenOffice die Access-Datei nicht wiederfindet, müssen Sie den Speicherort über das Menü Bearbeiten/Datenbank/Eigenschaften korrigieren.

17.05.08 @ 12:16
Kommentar von: Adrian [Besucher]  
Adrian

Hallo,

ich verwende NetBeans IDE 6.1
Die Anweisungen habe strickt abgearbeitet. Erster Unterschied, der mit aufgefallen ist:
Wie in Bild “Hier die neue Projektübersicht:” sieht es bei mir nicht aus. Nach Hauptfenster.java folgt kein weiterer Zweig - einfach nichts.
Die scrollTabelle kann ich lediglich im Inspector sehen.

Nachdem ich den QuellCode eins zu eins übernommen habe, erscheint allerdings nur ein graues Fenster 800x200. Die Tabelle erscheint nicht.

Output:

init:
deps-jar:
Compiling 1 source file to C:\Dokumente und Einstellungen\AKollmann\Eigene Dateien\NetBeansProjects\MELMIL\build\classes
Note: C:\Dokumente und Einstellungen\AKollmann\Eigene Dateien\NetBeansProjects\MELMIL\src\gui\Hauptfenster.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
compile:
run:
Connection Successful
BUILD SUCCESSFUL (total time: 8 seconds)

06.08.08 @ 15:46
Kommentar von: jrt [Mitglied]  
jrt

Vielleicht hast Du im package “gui” statt einem neuen “JFrame Form” nur eine ganz normale Java-Klasse angelegt. Das würde das Fehlen aller untergeordneten Punkte erklären. Der ganze grafische Editor für Swing-Benutzeroberflächen funktioniert nur in einem JFrame Form.

06.08.08 @ 18:49
Kommentar von: Matteo [Besucher]
Matteo

Super! Das Tutorium ist echt spitze. Ich bastel eben ein wenig an einer Idee und wollte schnell was mit Access nud Tabellen testen, und es läuft direkt. Ich bin begeistert.

07.09.08 @ 10:47
Kommentar von: Trummer Thomas [Besucher]
Trummer Thomas

Hallo, ich arbeite jetzt schon seit einiger Zeit mit Java und Accessdatenbanken. EIn Problem habe ich bis heute jedoch noch nicht lösen können.
Z.B. Habe ich ein kleines Programm das sehr viele Daten hintereinander in die Datenbank schreibt, jedoch bekomme ich hin und wider diesen Fehler: An unexpected error has been detected by Java Runtime Environment:.
Dieser Fehler tritt ungefähr jedes 10mal auf, auch auf wenn ich immer die gleichen Daten lade.

Hier ist mein Aufbau:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=” + datenbank, “", “");
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs=stmt.executeQuery("SELECT * FROM …");
for(…)
{
rs.moveToInsertRow();
rs.updateString(..,..);
rs.insertRow();
}

Ich hoffe mir kann jemand helfen.
mfg Tom

11.04.09 @ 12:55
Kommentar von: jrt [Mitglied]  
jrt

Hallo Thomas,

sicher bin ich mir nicht, aber es könnte an der Zeile

stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

liegen. Die beiden Einstellungen in der Klammer erfordern einen JDBC2-kompatiblen Datenbanktreiber.

Vielleicht hilft diese Beschreibung weiter: http://www.herongyang.com/jdbc/JDBC-ODBC-MS-Access.html

Da ist ein Beispiel dabei, in dem auf die zusätzlichen Parameter ganz verzichtet wird:

Statement sta = con.createStatement();

11.04.09 @ 18:34
Kommentar von: Trummer Thomas [Besucher]
Trummer Thomas

Hallo jrt,

ich hab die Variante mit Statement stmt = con.createStatement(); versucht. Jetzt habe ich leider ein neues Problem.
Wenn ich z.B. rs.first(); aufrufe kommt jetzt dieser Fehler: Result set type is TYPE_FORWARD_ONLY
Hast du dazu vielleicht auch eine Idee.

mfg Tom

11.04.09 @ 22:01
Kommentar von: jrt [Mitglied]  
jrt

In diesem Forenbeitrag
http://coding.derkeiler.com/Archive/Java/comp.lang.java.databases/2005-02/0164.html
heißt es, dass man per ODBC gar kein first() nutzen kann. Die JDBC-ODBC-Bridge ist ja auch nur eine “Krücke", kein vollwertiger Datenbanktreiber.
Sun hat da eine kleine Datenbank für richtige Treiber: http://developers.sun.com/product/jdbc/drivers
Ich setze Access übrigens nur noch dann ein, wenn ich Daten aus alten Tools importieren muss. Ansonsten bevorzuge ich MySQL, Derby, HSQLDB oder db4o - alle kostenlos zu bekommen…

12.04.09 @ 10:44
Kommentar von: Hannes [Besucher]
Hannes

Hallo!
Ich habe OpenOffice Base und damit eine Datenbank erstellt. Ich möchte mit java darauf zugreifen.
Habe gelesen, dass Base auf HSQL-Basis funktioniert. kann aber mit dem java-hsql driver nicht darauf verbinden.

Gibt es irgendeine Möglichkeit, dass ich mit java an die Base-DB rankomme? (*.odb)???

Vielen Dank!
Hannes

16.05.09 @ 19:14
Kommentar von: jrt [Mitglied]  
17.05.09 @ 09:59
Kommentar von: Harald Steinbichl [Besucher]
Harald Steinbichl

Hallo Herr Thies,

Ich bin auf ihr Tutorial gestoßen, als ich suchte, wie man eine Access DB mit JDBC anbinde.

Ich würde die grafischen Elemente in eine eigene Klasse bzw. Packet auslagern.

Und wichtig ist noch, dass sie bei ihrem Codebeispiel vergessen haben die DB-Verbindung wieder zu schließen:

con.close();

Also nur als kleine Anregung

Mir ist auch aufgefallen, dass der <= (kleinergleich)Operator auf der Website als [lt]= dargestellt wird.

Sonst finde ich das Tutorial sehr gut. Ich habe mich gleich ausgekannt.

MfG Harald


03.07.09 @ 22:46
Kommentar von: jrt [Mitglied]  
jrt

@H. Steinbichl:
Vielen Dank für Ihre Hinweise! Das Problem mit dem Kleiner-Zeichen muss durch umkopieren des Codes in die formatierte Version passiert sein. Ist korrigiert, ebenso das con.close().

04.07.09 @ 12:30
Kommentar von: Jule [Besucher]
Jule

Vielen danke für dieses wunderbare Tutoria.
Obwohl mittlerweile unter NB 6.9 läuft alles einwandfrei und ist bestens erklärt.
Es war mir ein idealer Einstieg um mit
meiner Access Db zu “reden".

19.07.10 @ 21:07