Zum Inhalt springen

JAVA und Access - Datumproblem


Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich habe hier ein Problem, was mich schier wahnsinnig macht.

Folgendes:

Ich habe eine Access Datenbank mit der ich über JdbcOdbc Treiber zugreife.

Diese Access Datenbank besitzt 2 Datumfelder des Formats:

19.11.2008 13:36:00

Dieses Datum soll nun schlicht und einfach in eine weitere Tabelle in Access kopiert werden.

Leider klappt dies überhaupt nicht.

Herausgefunden habe ich, dass Access anscheinend von "Extern" nur Daten akzeptiert, die eine "#" vorne und hinten haben: #19.11.2008 13:36:00#

Ich habe schon alles versucht:

- diverse Timestamps (waren leider nie passend)

- mal als String, mal als Date einfügen

- die "#" manuell da hineinsetzen und auch mal weglassen

Ich weiß nicht mehr weiter.

Gibt es irgendwo im Netz ein Tutorial oder hier jemanden, der mir helfen kann dieses o.g. Datumsformat in eine andere Access-Tabelle einzufügen?

Vielleicht ist auch mein Ansatz falsch.

Ach ja, in Access haben diese Felder das Format "Datum/Uhrzeit" und wenn ich mein PreparedStatement ohne diese blöden Datumsangaben durchlaufen lasse, funktioniert auch alles. Ich habs aufs Datum eingrenzen können.

Geschrieben

Also wenn du Datumswerte in Access einfügen möchtest, musst du die im selbem Format ausgeben, wie sie auch ausgegeben werden plus die Raute ( # ) davor und dahinter. Das sieht dann wie folgt aus:

#YYYY-MM-DD HH:MI:SS#

also in deinem Beispiel: #2008-11-19 13:36:00# (Ja, da muss explizit ein Leerzeichen zwischen dem Datum und der Zeit)

Dann müsste das eigentlich auch funktionieren, jedenfalls geht das bei mir so.

Geschrieben

Tuts bei mir leider nicht :(

Ich bekomme bei dem Statement der Art:

String sqlQueryInsert = "INSERT INTO TABELLE " +

"VALUES (?)";

stmt.setString(1, datum);

Folgenden Fehler:

[Microsoft][ODBC Microsoft Access Driver] Datentypen in Kriterienausdruck unverträglich.

Das Datum sieht laut Sysout so aus:

#30.11.2008 00:00:00#

Was mache ich falsch?

Geschrieben

Servus,

ich habe noch nicht mit JDBC und Access gearbeitet, aber bei Prepared Statements musst Du den jeweils gültigen Datentyp setzen, also bei Dir setDate(). Denn was aus dem Fragezeichen generiert wird, bestimmt ja der JDBC-Treiber, und der sollte wissen, wie er mit einem Datum umzugehen hat.

Peter

Geschrieben

Das ist ja das Problem.

Ich brauch diese o.g. dämliche Format, und das unterstützt Date nicht.

Ich hab mir aber sagen lassen, der Access in dem Sinne Date auch nicht kennt und nen String braucht.

Aber er fügt es einfach nicht ein.

Ich hab mir schon Code-Beispiele von Kollegen geholt die genau das gleiche machen, aber bei mir geht es einfach nicht. :confused:

Keiner weiß mehr weiter.

Geschrieben

Hmm, kann schon sein, dass ich zu dämlich bin. Ich verstehe Dein Problem, finde aber den Lösungsansatz komisch. Deine Erklärung habe ich nicht verstanden.

Du hast ein java.util.Date und sagst, dieses kennt ein Format xy nicht. Das ist auch gut so, denn dieses Date ist im Endeffekt nur ein Wrapper um die Millisekundenrepräsentation dieses Datums.

Du sagst, Dein JDBC Treiber kann mit einem Date nicht umgehen. Welchen Fehler erhältst Du denn, wenn Du ein Prepared Statement mit setDate fütterst? In meinen Augen ist das der korrekte Ansatz: versuchen, mit dem richtigen Lösungsweg(Date als Date hinzufügen) zu arbeiten, und nicht einen vermeintlich fehlerhaften Treiber mit unkorrekten Daten zu füttern (Thema Wiederverwendbarkeit und Plattformunabhängigkeit).

Peter

Geschrieben (bearbeitet)

Fehler steht oben.

Ich verstehe deine Erklärung ehrlich gesagt auch nicht.

1. Ich hab ein Datum aus Access. Typ Datum/Uhrzeit

2. Ich will dieses wieder in eine weitere Tabelle in Access einfügen

3. Ich muss "#" vorne und hinten dranpappen, damit es überhaupt geht. Wäre dann wieder ein String.

4. Ich hab von Kollegen hehört Access braucht trotz dieser Felddefinition kein Date-Format zum einfügen.

5. Der Treiber ist schon in Ordnung so.

Das tut es aber nicht.

Bearbeitet von Ganymed
Geschrieben

Ok, nochmal: Du hast in Access ein Datum. Hast Du beim lesen nach Java auch ein Datum? Ich hoffe doch. Wenn nein, dann selektierst Du schon falsch.

Nimm dieses Datum (Datentyp Date) und kleb es mit setDate() an Dein PreparedStatement.

Noch besser: liefer einen kleinen Ausschnitt Deines Quellcodes, wie Du liest und schreibst, dann kann man besser was sagen.

Ach ja, ich habe bei Dir keine Fehlermeldung gefunden, sondern nur eine Fehlerbeschreibung.

Peter

Geschrieben

Post Nr 3: [Microsoft][ODBC Microsoft Access Driver] Datentypen in Kriterienausdruck unverträglich.

Ich lese die Variable in ein Date ein. Diese muss ich aber wie schon mehrfach erwähnt mit den "#" umklammern. Mit der .format Funktion bewekstellige ich dies.

Da ich aber jetzt nun einen String hab, muss ich dies auch wieder so wie es ist in Access einfürgen.

Siehe auch oben, wie ich es mache.

Dann bekomme ich den o.g. Fehler.

Ih würde behaupten es ist logisch, weils kein Date ist, aber die Kollegen machen es auch so und ich hab wie gesagt die Info, dass Access im Prinzip kein Date-Format braucht, weswegen das auch bei den anderen zu funktionieren scheint.

Geschrieben (bearbeitet)

Also wie kingofbrain schon sagte, ein Code-Ausschnitt zu dem benannten Part würde wirklich sehr helfen, um zu verstehen was da genau bei dir im Code abläuft. Weil so richtig konnte ich das jetzt auch nicht nachvollziehen.

Wenn ich das aber nun richtig verstehe, bekommst du das Ergebnis der Abfrage gleich als Date Objekt (java.sql.Date). Dann brauchst du die Raute ( # ) Zeichen garnicht, weil du dann in deinem PreparedStatement einfach nur genau dieses Date Objekt wieder hinzufügen brauchst.

Um das mal verständlicher zu machen, ein kleines Beispiel:

try {

	Connection con = DriverManager.getConnection( "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:/db1.mdb","","" );


	// Date Objekt aus der Tabelle auslesen

	Statement s = con.createStatement();

	ResultSet r = s.executeQuery("SELECT datum from tabelle1 where text like 'Dragon'");

	r.next();

	Date d = r.getDate(1);

	s.close();


	//PreparedStatement erzeugen und als 2. Argument das Date Objekt übergeben

	PreparedStatement pstmt = con.prepareStatement("Insert into tabelle1 values (?,?)");

	pstmt.setString(1, "Dragon8");

	pstmt.setDate(2, d);


	pstmt.execute();

	pstmt.close();



	//Inhalt der Tabelle auslesen

	Statement stmt = con.createStatement();


	ResultSet rs = stmt.executeQuery("Select * from tabelle1");


	while(rs.next()) {

		System.out.println("Text: " + rs.getString(1) + "; Datum: " + rs.getString(2));

	}

} catch (SQLException e) {

	e.printStackTrace();

}
Gegeben sei dabei die Access Datenbank db1.mdb unter dem Pfad D:\db1.mdb. Diese hat eine Tabelle mit Namen tabelle1 und diese Tabelle wiederrum hat 2 Spalten. Eine vom Type "Text" mit Namen Text, und eine vom Type "Datum /Uhrzeit" mit Namen Datum. Die Tabelle ist mit folgendem Eintrag befüllt:
Name	| Datum

----------------------------

Dragon	| 2008-11-02 19:33:00
Wenn ich den Code da oben ausführe, erfolgt folgende Ausgabe:
Text: Dragon; Datum: 2008-11-02 19:33:00

Text: Dragon8; Datum: 2008-11-02 00:00:00

Er hat also das Datum vom 1. Eintrag ausgelesen und es dann beim zweiten Eintrag mit hinzugefügt. Was aber zu erkennen ist, über diese Funktion geht die Uhrzeit verloren.

Wenn jetzt noch immer nicht alles klar ist, dann bitte den Quelltextausschnitt von dir posten, damit wir uns den mal anschauen können, sonst kommen wir hier glaub ich nicht viel weiter.

Bearbeitet von Dragon8
Geschrieben

Gut. Ich habe jetzt leider immer noch nicht die Informationen, die ich haben wollte, und Deine Einwände passen in meinen Augen nicht zu meinen Hinweisen. Bis die Informationen eintreffen, lese ich noch ein bisschen mit und wünsch Dir viel Erfolg bei der Fehlersuche.

Peter

Geschrieben (bearbeitet)

@Dragon

Supi, ich glaub, du hast mich verstanden.

Ich hab es jetzt so umgebaut, wie bei dir. Jetzt hat er aber keine Uhrzeit mehr? Dass er immer eine 00:00 dahinter setzt hab ich auch schon entdecken dürfen...

Also wiefolgt:

Tabelle ist so befüllt:

 Datum

----------------------------

2008-11-02 19:33:00
Select etc. ist so (Quellcode aus Datenschutzgründen kastiert; man möge mir eventl. fehlende " etc. verzeihen :)):

stmt = con.createStatement();	

String sql = "SELECT DATUM" +

		"FROM TABELLE";

rSet = stmt.executeQuery(sql);


while (rSet.next()){

vardatum 		= rSet.getDate("DATUM");

String sqlIns = "INSERT TABELLE2 " +

                   "VALUES (?)";

stmt2.setDate(1, vardatum);

stmt2.executeUpdate();

}

So in etwa. Man möge mir Fehler verzeihen, die ich beim rauslöschen gemacht hab. Aber ich denke, man versteht, was ich gemacht hab. Was rauskommt ist nun folgendes:
 Datum

----------------------------

2008-11-02

Edit: Die getDate Funktion schneidet ab.

Bearbeitet von Ganymed
Geschrieben

Es geschehen Zeichen und Wunder!

Ich hab keine Ahnung warum, aber ich hole es jetzt mit getString ab und setze es einfach wieder mit getString.

Was er vorher immer mit irgendwelchen Fehlermeldungen der kreativsten Art quittiert hatte, geht jetzt.

Scheint daran zu liegen, dass ich das falsche Package importiert hatte.

Danke für die Hilfe, die mich auf den richtigen (wenn auch in meinen Augen unlogischen) Pfad gebracht hat :D

Geschrieben

ok, ist zwar dann nicht unbedingt die sauberste Lösung, aber wenigstens geht es...

Auch wenn ich nicht so ganz verstehe, warum das Date Objekt aus dem sql Package keine Uhrzeit speichert. :rolleyes:

Geschrieben

Servus,

das liegt daran, dass es so in der Dokumentation steht: Date (Java 2 Platform SE v1.4.2)

Für Zeit und Datum gibt es die Klasse Timestamp.

Und genau das, was Du in Deinem vorletzten Post gemacht hast, habe ich Dir seit meiner ersten Antwort versucht, zu erklären. :) Wenn Du erfolgreich Software entwickeln willst, solltest Du in meinen Augen solche Bastellösungen nicht vorsehen. Ein Datum ist ein Datum und keine Zeichenkette, auch wenn ich ein Datum auf verschiedene Art und Weise als Zeichenkette darstellen kann.

Schöne Grüße,

Peter

Geschrieben
Wenn Du erfolgreich Software entwickeln willst, solltest Du in meinen Augen solche Bastellösungen nicht vorsehen.

1. Ich habe geschrieben, dass ich dich nicht verstanden habe

2. Dragon hat mir mit seinem hilfreichen Beispiel gut auf die Sprünge geholfen, nämlich, dass ich das falsche Paket importiert hatte und deswegen mal das eine mal das andere nicht ging. Das sich die beiden nicht vertragen wußte ich nämlich nicht und mit JAVA hab ich quasi Null Erfahrung und übe z.Zt. noch.

3. Zwischenzeitlich habe ich auch nen Timestamp gestern Abend noch eingebaut, was ich aber hier nicht niedergeschrieben hatte.

4. So was altkluges kann ich ja schonmal gar nicht leiden.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...