jdbc datenbankbooster

tk-germany

Grünschnabel
Hallo Zusammen,
ich möchte gern einen DatenbankBooster erstellen.
Grundgedanke, ein Programm dem man 2 Datenbanken und deren Typ ("sybase" oder "oracle") nennt, dazu 2 Tabellen und die Spalten.
Anhand dessen soll das Programm von Datenbank1.Tabelle1.Spalten1() nach Datenbank2.Tabelle2.Spalten2() kopieren.
Da das Programm dann jedoch in diversen Fachbereichen angewandt werden soll, sollte es so allgemein wie möglich gehalten sein. Daher auch die einzelnen inputwerte die mit Hilfe einer Konfigurationsdatei übergeben werden, der Name der Konfigdatei ist der Startparameter des Programmes, sodaß man Ihm bei jedem Start eine neue Konfiguration überhelfen kann.

Mein Problem nun:
bei JDBC nutzt man, wenn ich das als Neuling richtig verstanden habe für einen Datenbankinsert ja preparedstatements.
Die Statements bekomme ich auch schon richtig prepared, variabel, je nach Anzahl der Spalten etc.

Aber dann gibt man dem Statement ja die Werte via
<statement>.set<Datentyp>(<nr>, <wert>)

Jedoch kenne ich den Datentyp ja garnicht im Voraus, wie kann ich realisieren, das das Programm trotzdem variabel bleibt und alle Datentypen "kopieren" kann?

Eine weitere Frage ist, bei Sybase und Oracle gibt es zum Teil ja verschiedene Datentypen, kann ich irgendwie absichern, das QuellZelle wirklich in ZielZelle paßt oder kann ich das nur per Try{} und catch{} abfangen?

Vielen Dank und viele Grüsse,
Thomas
 
mit instanceOf() kannst du per if sämtliche vorkommenden Datentypen überprüfen und die entsprechenden set<Datentyp>-Methoden aufrufen.
 
Vielen Dank,
also wenn ich das richtig verstehe muss ich mit:

if(obj instanceof String) insert.setString(i+1, obj);
else if(obj instanceof Integer) insert.setInt(i+1, obj);

alle Datentypen durchnudeln, oder?

und wie bekomme ich bei der Abfrage den genauen Datentyp?
weil da muss ich ja auch den Datentyp für getString etc. wissen, aber wie erhalte ich den ohne vorher die Abfrage zu machen?
 
Andersrum geht es so:

Code:
if (String.class.isAssignableFrom(<deine Variable hier>.getClass())) {
  blablaString();
} else if (Integer.class.isAssignableFrom(<deine Variable hier>.getClass())) {
  blablaInteger();
}
 
Andersrum geht es so:

Code:
if (String.class.isAssignableFrom(<deine Variable hier>.getClass())) {
  blablaString();
} else if (Integer.class.isAssignableFrom(<deine Variable hier>.getClass())) {
  blablaInteger();
}

Was meinst Du mit "andersrum"?
Was genau "tut" String.class.isAssignableFrom?

Also um den Datentyp der Zielspalte zu ermitteln hilft dir das weiter:
http://www.tutorials.de/forum/java/...-und-dementsprechend-string-konvertieren.html

Hier gibt es ein schönes Mapping des JDBC Types auf Java und Oracle Type
http://download.oracle.com/docs/html/A64685_01/basic3.htm

Vielen Dank für die Mappings, das ist Super
Wenn ich aus den Metadaten der Quelltabelle die Datentypen auslese (mit: sqlrsmd.getColumnType(Spaltennummer)) erhalte ich Zahl, wie bekomme ich dann raus welchem Datentyp aus dem Mapping das entspricht?

Und noch eine sicherlich relativ dumme Frage:
wie gehe ich am besten mit benutzerdefinierten Datenfeldtypen um?
Einfach als String behandeln?
 
Was meinst Du mit "andersrum"?
Was genau "tut" String.class.isAssignableFrom?

1. Frage:
Andersrum meint in diesem Fall, das Gegenteil von deiner ursprünglichen Frage, die mit instanceof gelöst wurde.

2. Frage:
Das würde ein Blick in die API klären... http://java.sun.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)
Die Funktion liefert dann true zurück, wenn das zu überprüfende Objekt (<Deine Variable>.getClass()) eine Kindklasse von String ist. (D.h. entweder ist die Klasse String, oder eine von dir definierte Klasse z.B. class MyString extends String)

Etwas wirr, aber ich hoffe, du steigst da durch. ;)

Ansonsten scheinen die von Anime-Otaku geposteten Mappings dein Problem eleganter zu lösen.
 
Diese Zahl die du bekommst entspricht dem JDBC Datentyp, den du über Types.X abfragen kannst....

Java:
		switch (sqlType) {
			case Types.CHAR:
			case Types.LONGVARCHAR:
			case Types.VARCHAR:
				preparedStatement.setString(count, value);
				break;
			case Types.FLOAT:
			case Types.DOUBLE:
				preparedStatement.setDouble(count, Double.parseDouble(value));
				break;
			case Types.BIT:
				preparedStatement.setBoolean(count, Boolean.parseBoolean(value));
				break;
			case Types.TINYINT:
				preparedStatement.setByte(count, Byte.parseByte(value));
				break;
			case Types.SMALLINT:
				preparedStatement.setShort(count, Short.parseShort(value));
				break;
			case Types.INTEGER:
				preparedStatement.setInt(count, Integer.parseInt(value));
				break;
			case Types.BIGINT:
				preparedStatement.setLong(count, Long.parseLong(value));
				break;
			case Types.REAL:
				preparedStatement.setFloat(count, Float.parseFloat(value));
				break;
			case Types.NUMERIC:
			case Types.DECIMAL:
				preparedStatement.setBigDecimal(count, new BigDecimal(value));
				break;
			default:
				throw new ConfigurationException(
						"unsupported SQL data type, no converting available for int type: " + sqlType);
		}
 
Großartig, ihr seid echt klasse, vielen Dank

Tut mir leid, wenn meine Fragen etwas doof waren, bin leider Java Neuling und versuch mir das grad selbst anzueignen und glaub auch, dass ich mich dazu mit dem Projekt etwas übernommen habe und muss sagen, für Neulinge die aus der Prozeduralen Pascalwelt kommen, is Java echt der blanke HORROR!

Auf der einen Seite habt Ihr meinen Glauben an die Welt gerettet und das es doch noch Menschen gibt, die einem helfen.
Auf der anderen Seite habt Ihr soeben mein Wochenende zerstört, weil ich jetzt wohl das ganze WE versuchen werd weiterzukommen mit dem Projekt.

Auf jeden Fall aber: herzlichsten Dank
 
In dieser Form zerstöre ich immer wieder gerne Wochenenden. :D
Wenn du Fragen hast, einfach wieder hier an's Forum wenden, es gibt hier viele, die einem schnell helfen.
 

Neue Beiträge

Zurück