Ganymed Geschrieben 2. Dezember 2008 Geschrieben 2. Dezember 2008 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. Zitieren
Dragon8 Geschrieben 2. Dezember 2008 Geschrieben 2. Dezember 2008 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. Zitieren
Ganymed Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 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? Zitieren
kingofbrain Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 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 Zitieren
Ganymed Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 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. Zitieren
kingofbrain Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 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 Zitieren
Ganymed Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 (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 3. Dezember 2008 von Ganymed Zitieren
kingofbrain Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 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 Zitieren
Ganymed Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 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. Zitieren
Dragon8 Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 (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 3. Dezember 2008 von Dragon8 Zitieren
kingofbrain Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 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 Zitieren
Ganymed Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 (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 3. Dezember 2008 von Ganymed Zitieren
Ganymed Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 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 Zitieren
Dragon8 Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 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. Zitieren
Ganymed Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 Frag' mich nicht... Ich bastel da jetzt so lange rum, bin froh, dass es funktioniert. Zitieren
kingofbrain Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 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 Zitieren
Ganymed Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 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. Zitieren
Empfohlene Beiträge
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.