"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

HELP: Zugriff auf MS Access über JDBC-ODBC

prayerslayer 22.02.2008 - 10:06 5509 5
Posts

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
moin moin.

wie einige von euch vielleicht gemerkt haben, habe ich eine datenbank im sql server 2005 erstellt und eine oberfläche zur bedienung dafür in java geschrieben. so. die alten daten sind aber in einem pöhsen passwortgeschützten mdb-file gefangen und mein plan war, ein programm zu schreiben, welches sich dort hineinschleicht und die daten befreit, in dem es ein insert-skript für die neue (sql server 05) datenbank schreibt.

ich bekomm aber den zugriff von java aufs mdb nicht hin :( bis jetzt hab ich es mit jackcess und noch jackcess-jdbc probiert, aber aufgegeben, weil ich bei beiden fehlermeldungen bekam, die ich nicht verstanden habe. außerdem hab ich kein tutorial im internet gefunden, was mir sowas immer besonders schwer macht ;)

zu guter letzt hab ich mich doch für die von sun in jdk 6 zur verfügung gestellte jdbc-odbc-bridge entschieden. ich hab viele code-snippets gesehen, aber es FUNKTIONIERT EINFACH NET!

mein code:
Code: PHP
public static final String DB_DRIVER="sun.jdbc.odbc.JdbcOdbcDriver";
public static final String DB_URL="jdbc: odbc: Driver={Microsoft Access Driver (*.mdb)};DBQ=";
public static final String DB_USER = "Administrator";
public static final String DB_PW=" pw ";
public static final String DB_URLDNS="jdbc: odbc: DokuAlt";

File mdb = new File("D:"+File.separator+"Leistungsdokumentation"+File.separator+"Dokumentation.mdb");
if (mdb.exists() && mdb.canRead())
{
  String url = DB_URL+mdb.getAbsolutePath();
  System.out.println("URL: "+url);

  Class.forName(DB_DRIVER);
  Connection knexon = DriverManager.getConnection(url, DB_USER, DB_PW);
}

der error:
Code: PHP
compile:
run:
URL: jdbc: odbc: Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\Leistungsdokumentation\\Dokumentation.mdb;
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Kein zulässiges Kennwort.
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Kein zulässiges Kennwort.
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
        at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3073)
        at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
        at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at transferfrommdb.Main.main(Main.java:31)
BUILD SUCCESSFUL (total time: 0 seconds)

die spaces bei beim driver hab ich nicht in echt gemacht, nur jetzt, damit keine smileys draus werden. und die url stimmt eigentlich auch, der php-tag mag anscheinend keine backspaces. die kombination user+pw hab ich beliebig probiert, ohne+mit, ohne+ohne, mit+mit+, mit+ohne, nix geht, immer der gleiche fehler. das passwort selbst stimmt, die spaces gehören dazu.

hat wer BITTE eine lösung oder einen workaround? mich kotzt des an.

tia
Bearbeitet von prayerslayer am 22.02.2008, 10:55

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3241
passwort aus der .mdb entfernen? :D

Zitat
For an MS Access database password, use:

Connection con=DriverManager.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=D://Jan1//TS-100061-2006-JAN-1.mdb;PWD=04027240411;");

hast es so schon mal probiert, also mit password direkt in den connection string?

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
ja, ersteres hab ich mir gestern auch gedacht, hab's aber anscheinend vergessen, weil access 2k datenbanken im access 2k7 nicht ohne eine änderung im vb editor bei den verweisen funktoionieren. hat mich auch viel nerven gekostet :D

@pw in url: ich schau mal kurz, wart...

//...nö, haut auch nicht hin. dafür geht's, wenn man das passwort rausnimmt. :o also bis auf weiteres solved, danke :)
Bearbeitet von prayerslayer am 22.02.2008, 10:53

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
del
Bearbeitet von prayerslayer am 26.02.2008, 15:01

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
hui, ich bin's wieder! :) folgendes: weil ich jetzt grad dabei bin, die daten, die ich mir mühsam von access in den sql server geholt habe, wieder (gleiche struktur wie in ms sql) in access zu schreiben (hört sich schräg an, aber bitte nicht fragen :D), hab ich wieder ein problem.

im sql server gibts dieses tolle SET IDENTITY_INSERT <Table> ON (kann den primary key beim insert angeben und das automatische inkrementieren desselben funkt nachher trotzdem) feature, das gleiche hätte ich gerne in access, hab aber im google bis jetzt nichts gefunden. zwar hab ich was von einer "append query" gelesen, aber entweder nicht verstanden oder sie ist wirklich nicht das, was ich suche.

help plz! tia :)

//bitte _ohne_ die access gui bemühen zu müssen...

///ein workaround wäre natürlich, in der access-table das PK-feld erst auf NOT NULL zu setzen und später mit ALTER TABLE als PK zu definieren. dann hätte ich die richtigen IDs drin, aber haut das autoinkrementieren danach hin, wenn ich einen neuen datensatz einfüge?

////genau! und was da das problem war: dann hab ich nur einen integer als PK, aber keinen "counter" (wies im access so schön heißt) deswegen _kann_ ich ja gar keine automatischen werte kriegen... :(

/////wuha, fast gelöst. das man mit Alter Table [Tabellenname] Alter Column [Feldname] Counter(n,m) auch den startwert und so setzen kann, steht auf den meisten access-hilfeseiten nämlich nicht :o jetzt muss ich nur noch eine lösung dafür finden, dass die tabelle gesperrt werden kann :/

//////lösung für gesperrte tabelle gefunden (connection zu, connection auf), aber neues problem. damit die zeile oben hinhaut, muss das feld schon vorher ein counter gewesen sein... :(
Bearbeitet von prayerslayer am 07.03.2008, 14:14

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
ok, ich hab herausgefunden, wie es geht. trial & error ftw! hier die anleitung mit ein bissi pseudocode.

tabelle A: alte tabelle
tabelle B: tabelle, in die die daten transferiert werden sollen

1. in tabelle B den zukünftigen primary key einfach als counter definieren.
Code:
CREATE TABLE B (ID COUNTER, <other fields>);

2. daten von A nach B transferieren und dabei die ID in der INSERT anweisung angeben.

3.
Code:
int max = SELECT MAX(ID) FROM B;

4.
Code:
ALTER TABLE B ALTER COLUMN ID COUNTER(max+1, 1);

5.
Code:
ALTER TABLE B ADD CONSTRAINT PK_B PRIMARY KEY (ID);

das ganze führt dazu, dass die alten IDs in der neuen tabelle übernommen werden (access nimmt sie beim insert an). danach muss man das feld noch als PK definieren, dazu holt man sich (3.) zuerst die höchste ID raus und resettet den startwert und die schrittweite vom counter (4.). am schluss noch die spalte als PK machen (5.), fertig.

bei schritt 4 darf die tabelle allerdings _von niemandem_ verwendet werden, sonst geht's nicht.

hth irgendwem.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz