jdbc datenbankbooster

Hallo zusammen,
also ich bin schonmal ein ganzes Stückerl weiter gekommen, dank euch.
Aber ein paar Fragen existieren nachwievor:

1. Gibt es eine Klasse etc, der ich einfach eine Type-Nummer gebe und sie gibt mir als String den Type-Namen zurück?

2. welchen Datentyp nehme ich am besten um ohne Probleme alle Arten von Datentypen aus der Datenbank einlesen zu können.
Ich habe Object gewählt, ist das eurer Meinung die richtige Wahl?

3. wie kann ich problemlos die verschiedensten Arten von Datumsfeldern aus 2 verschiedenen Datenbanksystemen auslesen, bzw. in sie schreiben?
Die Systeme sind, wie oben genannt Oracle und Sybase und es gibt Datumsfelder mit Uhrzeit, ohne Uhrzeit und in verschiedenen Anordnungen von Tag, Monats und Jahresfeldern...

Derzeit habe ich dazu in die Konfigdatei einen String eingebaut:
#srcdateformat, Format der Datumsfelder der Quelldatenbank
srcdateformat="yyyy-MM-dd HH:mm:ss.S"
#tardateformat, format der Datumsfelder der Zieldatenbank (hier Sybaseangabe)
tardateformat="112"

Das Datum lese ich wie folgt aus:
case Types.DATE:
SimpleDateFormat format = new SimpleDateFormat(konfig.srcdateformat);
try {
ausgabe = format.parse(sqlresult.getString(Spalte));
} catch (ParseException e) {
System.out.println("Fehler bei der Datumsumwandlung: " + e);
}

und schreibe es so:
case Types.DATE:
sqlprestmt.setDate(Spalte, (Date)setdata);
break;

Jedoch erhalte ich:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.sql.Date
Aber ich hab es doch vorher umformatiert...!?

auch wenn ich es mit
ausgabe = sqlresult.getDate(Spalte);
auslese erhalte ich diese Fehlermeldung (btw: ausgabe = Object)

In beiden Fällen enthält ausgabe den Wert: 2007-04-12 04:01:18.0 in der gleichen Formatierung.

Wäre toll, wenn Ihr mir auch hier helfen könntet, vielen Dank und Gruss,
Thomas
 
1. Du kannst statt dem int auch den JDBC Namen holen resultSetMetaData.getColumnTypeName(1), aber mehr nicht (soviel ich weiß), da du ja auf der JDBC Ebene arbeitest und die Oracle Datentypen dazu nicht kennst (außer es gibt ne spezielle Oracle lib vielleicht^^)

2. Object hört sich gut an^^

3. Du bekommst ja beim auslesen kein String zurück, sondern ein sql.Timestamp, Time oder Date....von daher verstehe ich nicht ganz, was du dann mit den String hantieren willst.
Es gibt Datentypen, da hat man halt nur ein Datum (Date) oder eine Zeit (time) oder einen kompletten Zeitstempel mit Datum und Zeit (timestamp)
 
Huhu :)
1. na danke, paßt doch, grummel, das hätt ich wohl auch selber finden können, aber als einsteiger überrennt einen die pure Fülle von Java :)

2. klasse, immerhin ein was, was ich von allein richtig gemacht hab! :)

3. und wie helf ich das der Zieldatenbank dann wieder über?
weil wie gesagt: sqlprestmt.setDate(Spalte, (Date)setdata); will er auch nich,
er mäkelt an: java.lang.String cannot be cast to java.sql.Date
setdata ist ein Object und die Ausgabe von:
SimpleDateFormat format = new SimpleDateFormat(konfig.srcdateformat);
ausgabe = format.parse(sqlresult.getString(Spalte));

und zu:
sqlprestmt.setDate(Spalte, setdata);
sagt er:
The method setDate(int, Date) in the type PreparedStatement is not applicable for the arguments (int, Object)

Danke schonmal :)
 
Zuletzt bearbeitet:
Er weiß ja nicht von welchem Datentyp, das Object ist. Daher musst du erstmal mittels ifs und instanceof Unterscheiden welches Objekt du bekommst und dementsprechend es setzen und casten.
 
Hallo,

Code:
if(obj instanceof String){
   String s = (String)obj;
   //mach was
}

Code:
if(String.class.isAssignableFrom(obj.getClass())){
   String s = (String)obj;
   //mach was
}

MFG

Sascha
 
Daran siehst du....aha das ist ein String....wenn du weißt, dass du nur Text darin speicherst, kannst du gleich setString machen.

Wenn du aber die Stringklasse auch für Zahlen zum speichern verwendest (oder sonst was), musst du hier noch auf die Zieldatentyp unterscheiden und dementsprechend konvertieren.
 
Hallo Sascha,
vielen Dank, so erhalte ich aus meinem Object einen String, aber ich brauche ein Date oder irgendwie vermute ich mittlerweile, dass ich was ganz anderes brauche.

auch dieser Code:
Date datum = (Date) setdata;
sqlprestmt.setDate(Spalte, datum);

erzeugt den Fehler:
Lese Quelle.Spalte3(Type91)=2007-04-12 04:01:18.0...
Schreibe Ziel.Spalte3... Spaltentyp=91(DATE)
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.sql.Date

Habe noch das hier gefunden:
http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/statement.html

d, t, and ts for date and time literals DBMSs differ in the syntax they use for date, time, and timestamp literals. The JDBC API supports ISO standard format for the syntax of these literals, using an escape clause that the driver must translate to the DBMS representation. For example, a date is specified in a JDBC SQL statement with the following syntax:
{d 'yyyy-mm-dd'}

In this syntax, yyyy is the year, mm is the month, and dd is the day. The driver will replace the escape clause with the equivalent DBMS-specific representation. For example, the driver might replace {d 1999-02-28} with '28-FEB-99' if that is the appropriate format for the underlying database. There are analogous escape clauses for TIME and TIMESTAMP:
{t 'hh:mm:ss'}
{ts 'yyyy-mm-dd hh:mm:ss.f . . .'}

The fractional seconds (.f . . .) portion of the TIMESTAMP can be omitted.

"The driver will replace the escape clause with the equivalent DBMS-specific representation"
Das klingt ja eigentlich ganz gut, aber ich hab absolut keinen Plan wie ich das in die Tat umsetzen kann.
 
Vielleicht liegt es daran, das setdata ein String ist.....und somit nicht im geringsten was mit einem Date Objekt zu tun hat.:eek:

Die einfachste Variante ist, dass du aus dem Resultset der Quelldatenbank ein Date herausholst und dieses dann in die neue Datenbank steckst.

Oder du musst den Datumstring parsen, mit SimpleDateFormat und den java.util.Date nach java.sql.Date konvertieren.
 
Zurück