Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten

static

Mitglied
Hallo zusammen,

habe mittlerweile n bisschen rumgegooglet und nach Informationen für mein Problem gesucht, jedoch leider nichts gefunden.
Es geht um die Umstellung von AS400 auf Postgresql und die Probleme, die daraufhin auftreten.

In meinem Code ging es bisher lediglich darum, Name und Typ der Spalten auszulesen und in eine Hashtable zu speichern. Hatte bis jetzt auch einwandfrei funktioniert:

Java:
			ResultSetMetaData rsMeta = rs.getMetaData();
			
			for(int i = 0; i < rsMeta.getColumnCount(); i++)
			{
				if(!threadActive){return;}	// Abbruch, wenn threadActive false gesetzt wird 
				
				// Überprüfung des Datentyps aller Sätze (NUMERIC = LONG, VARCHAR = STRING)
				int 	type = rsMeta.getColumnType(i+1);
				String 	name = rsMeta.getColumnName(i+1);
				
				// TYPE_VALUES: NUMERIC = 1, CHAR = 2
				switch(type)
				{
					case Types.CHAR		: hash.put(name, rs.getString	(name).trim()); break;
					case Types.NUMERIC	: hash.put(name, rs.getInt		(name)); 		break;
				}
			}

Jetzt habe ich jedoch das Problem, dass ich beim Wechsel auf eine Postgresql-DB folgende Exception ausgeschmissen bekomme:
[WR]org.postgresql.util.PSQLException: Unzulässiger Wert für den Typ int : 7000000024.
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toInt(AbstractJdbc2ResultSet.java:2504)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:1988)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:2211)[/WR]

Die Exception bezieht sich auf diese Codezeile:
Java:
int 	type = rsMeta.getColumnType(i+1);

Anscheinend gibts ein Problem mit den Meta-Funktionen bei Postgre, jedoch weiß ich einfach nicht, was genau der Rechner von mir hören will, damit es funktioniert :D
Falls noch irgendwelche Informationen fehlen sollten, einfach schreien ^^

mfg static

[EDIT: So im Nachhinein fällt mir auf, dass der Bereich "Netzwerkprogrammierung" doch nicht so der passendste war, sorry dafür:/]
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Moin,

der Code sieht -soweit ich das beurteilen kann- gut aus. In welcher Zeile Deines Codes fliegt die Exception genau?

Zum Debugging schaue Dir mal die Werte von i, und type an. Entweder im Debug-Modus oder mit System.out.println

Ansonsten noch ein paar allgemeine Tipps:
Java:
 if(!threadActive){return;}
Wird die Variable von einem anderen Thread während des Schleifendurchlaufs geändert? Falls ja, erhälst Du möglicherweise eine unvollständig gefüllte HashMap. Falls nein, wird die Prüfung unnötigerweise bei jedem Schleifendurchlauf gemacht. Besser erst das if und dann die Schleife und nix verschachteln.

Mit der Methode
Code:
getColumnTypeName(int column)
des ResultSetMetadata kannst Du Dir direkt den Namen ausgeben lassen. Damit sparst Du Dir den Umweg über das int und den switch.

Und, bei einem
Code:
switch
das
Code:
default :
nicht vergessen. Auch wenn Du nur CHAR und NUMERIC sehen willst, verschlucke die anderen Fälle nicht, sondern logge sie wenigstens.
 
Zuletzt bearbeitet von einem Moderator:

static

Mitglied
Durch ein wenig rumprobieren habe ich den Fehler doch erfolgreich gefunden :D

Es lag anscheinend am
Java:
case Types.NUMERIC  : hash.put(name, rs.getInt      (name));        break;
, anscheinend wollte er rs.getLong hören.

Außerdem, unabhängig von diesem Problem, ist mir aufgefallen, dass meine Hashtable leer war, da ich beim Auslesen den Key mit upperCase angegeben habe. Postgre jedoch spuckt mir den namen aus dem ResultSet im lowerCase aus, worauf das Auslesen mit nem upperCase Key natürlich null auswirft :D

Merke:

-AS400-
Java:
rsMeta.getColumnName(i+1)    // Ausgabe upperCase
-Postgre-
Java:
rsMeta.getColumnName(i+1)    // Ausgabe LowerCase

Trotzdem danke für die Mühe @ nillehammer :)
 

Neue Themen


Oben