# Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten



## static (27. Aug 2012)

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:


```
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: 

```
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 
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:/]


----------



## nillehammer (27. Aug 2012)

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:

```
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 
	
	
	
	





```
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 
	
	
	
	





```
switch
```
 das 
	
	
	
	





```
default :
```
 nicht vergessen. Auch wenn Du nur CHAR und NUMERIC sehen willst, verschlucke die anderen Fälle nicht, sondern logge sie wenigstens.


----------



## static (27. Aug 2012)

Durch ein wenig rumprobieren habe ich den Fehler doch erfolgreich gefunden 

Es lag anscheinend am 

```
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 

*Merke:*

-AS400-

```
rsMeta.getColumnName(i+1)    // Ausgabe upperCase
```
-Postgre-

```
rsMeta.getColumnName(i+1)    // Ausgabe LowerCase
```

Trotzdem danke für die Mühe @ nillehammer


----------

