# Auslesen DatenbanktabelleDatei iSeries



## Ollek (9. Dez 2011)

Hallo,

ich habe folgendes Problem.

Wenn ich eine Datei auf einer iSeries anlege und diese mit folgendem SQL fülle.

select 'lalalala', number from bib/tabelle

Steht in meiner Tabelle auf der Datenbank

lalalala 100

Wenn ich diese Daten nun abfrage mit Java, und in einer CSV speichere. Dann werden die Daten völlig falsch ausgegeben und zwar so:

938193819381A2;2;

Das lalala wird in Zahlenumgewandelt.. Warum auch immer.. Hat jemand so ein problem schon gehabt?
Bräuchte dort dringend hilfe :rtfm:

Viele Grüße


----------



## ARadauer (9. Dez 2011)

> Wenn ich diese Daten nun abfrage mit Java, und in einer CSV speichere


seltsam... zeig mal den code...


----------



## SlaterB (9. Dez 2011)

in jedem Fall ist es komplett unsinnig, zwei Schritte auf einmal zu machen, 
damit wird nur die Fehlerquelle verschleiert, einen anderen Nutzen ergibt sich daraus nicht,

wann immer irgendwo auf der Welt ein Problem auftritt muss es möglichst eingegrenzt untersucht werden,
gib das, was du aus der Datenbank ausliest, mit System.out.println() aus!, oder gib die Länge des Strings aus, 
zähle mit einer Schleife wie oft ein char 'a' drin ist/ wie oft '9',

wenn dabei alles ok ist, dann ist erstmal anzunehmen, dass die DB nicht das geringste mit dem Problem zu tun hat, 
anderenfalls ist anscheinend die CVS-Ausgabe komplett egal
-> in jedem Fall das Problem (normalerweise) um 50% reduziert, danach kann man weiter nachschauen


----------



## Ollek (9. Dez 2011)

Wieso 2 Schritte auf einmal? Versteh nicht, was du damit meinst...

Mein erster Schritt ist es, auf der iSeries eine Datei in meiner Bib anzulegen. Diese Datei fülle ich
mit einem SQL Select Statement.
In diesem SQL Statement gebe ich eine Konstante hier Beispiel 'lalala' in Hochkommata ein und eine nummer aus der Tabelle auf diese ich das SQL ausführe.
Mein Programm holt sich lediglich die Daten aus der Datei in meiner Bib. Wo siehst du 2 Schritte? Der eine ist manueel von mir ausgeführt und mein Programm führt lediglich das abholen aus.. Oder habe ich dich falsch verstanden??

Habe es schon mit syso schon vor meinen Beitrag einmal ausgegeben... Erhalte dort schon die falsche Ausgabe.. Sprich am Schreiben in die CSV kann es nicht liegen.. Es muss auf den Weg von DB in mein ResultSet liegen...

Mein Code:


```
exceuteSelect(String system, String sql, String saveDir){
		Connection conn = DatabaseUtil.getInstance().openConnectionToAS400(system, prop.getDb_user(), prop.getDb_password());
		ResultSet rs = null;
		boolean split = false;
		try {
			sql = sql.replace("/", ".");
			PreparedStatement pStmt = conn.prepareStatement(sql);
		
			rs = pStmt.executeQuery();
			
			ArrayList<String[]> arrlDataSet = new ArrayList<String[]>();
			int iRow = rs.getMetaData().getColumnCount();

			// Wenn Header true ist, Header setzen
			if(exportsetting.isHeader()){
				String[] arrRowNames = new String[iRow];
				for(int i = 0; i < iRow; i++)
					arrRowNames[i] = rs.getMetaData().getColumnName(i+1);
				
				arrlDataSet.add(arrRowNames);
			}
			
			while(rs.next()){
				
				String[] arrRows = new String[iRow];
				for(int i = 0; i < arrRows.length; i++){
					
					String strRow = rs.getString(i+1);
					if(strRow != null){
						strRow = strRow.trim();
					}
					
					if(exportsetting.isTextkennzeichen() && strRow != null){
						if(strRow.matches("\\D*"))
						    arrRows[i] = strRow;
						else
							arrRows[i] = "\"" + strRow + "\"";
						
					} else {
						arrRows[i] = strRow;
					}
				}
				
				arrlDataSet.add(arrRows);
				
				if(arrlDataSet.size() > 1000){
					csvFac.writeCSV(saveDir, arrlDataSet, ';', split);
					split = true;
					arrlDataSet.clear();
				}
			}
			
			csvFac.writeCSV(saveDir, arrlDataSet, ';', split);
			
			return true;
		} catch (SQLException e) {
			log4jLogger.log(Level.ERROR, this.getClass(), "Statement [" + sql +"] konnte nicht ausgeführt werden", e);
			
			generateExceptionPane(e);
			
			return false;
		} finally { DatabaseUtil.getInstance().closeConnectionToAS400(); }
	}
```

Komme leider nicht weiter...


----------



## SlaterB (9. Dez 2011)

> Wieso 2 Schritte auf einmal? Versteh nicht, was du damit meinst...
+
> Habe es schon mit syso schon vor meinen Beitrag einmal ausgegeben... Erhalte dort schon die falsche Ausgabe.. Sprich am Schreiben in die CSV kann es nicht liegen.. 

hast du wirklich nicht verstanden wie ich 1. Schritt: DB, 2. Schritt CSV beschrieben habe?

du hast nun selber schon erkannt dass CSV nichts damit zu tun hast, 
erkennst du wieviel z.B. allein von der Überschrift 'Auslesen Datenbanktabelle - Fehler bei Datenausgabe in CSV' jetzt irrelevant ist?
fast alles ab dem - kann man jetzt streichen, CSV ist überhaupt nicht mehr relevant im Thema

------

jedenfalls fast, dein Code enthält gar keine System.out.println(), damit ist das noch nicht geklärt,
was genau hast du mit welchen Ergebnissen alles schon getestet?

du hantierst da mit einem Set von Arrays, gibst du zufällig das Array an sich aus (dessen toString() nur Müll liefert) 
oder doch korrekt die einzelnen Elemente?
deine System.out.println()-Befehle wären interessant oder alternativ eben doch, was 
>  csvFac.writeCSV(saveDir, arrlDataSet, ';', split);
mit dem Set der Arrays macht


----------



## Ollek (9. Dez 2011)

```
System.out.println(rs.getString(i+1));
System.out.println(rs.getCharacterStream(i+1));
```

Das sind so 2. Ich weiß nicht, wo ich sonst noch Sysos einbauen soll...

Also mir kommt es so vor, als wenn im resultSet schon die falschen Daten stehen..
Die .toString() Methode rufe ich nirgends auf.. Arbeite eigentlich alle einzelnen Elemente im RS ab.

ich hole mir nur immer aus dem rs die Daten mit rs.getString()

die von dir angesprochende Methode schreibt die Daten aus dem RS set, welche in eine ArrayList hängen in deine Datei. Das Split ist dabei die boolean, ob schon daten in der Datei stehen oder nicht, denn wenn eine Menge von Daten im ResultSet stehen schreibe ich alle 1000 in die Datei, damit de schnelligkeit der abarbeitung weiterhin gegeben ist...


----------



## inv_zim (9. Dez 2011)

Mal vorweg noch zwei Fragen: Datentypen in beiden Dateien sind identisch? Die EBCDIC Kodierung auf den iSeries ist auch nicht das Problem?


----------



## SlaterB (9. Dez 2011)

hmm, ich fürchte dass ich dazu nichts weiter kontrollier beitragen kann, zwei Dinge noch:

- erzähle mehr darüber worum es geht, falls das dem geneigten Publikum nicht klar sein sollte, aber ob das genau hier reinschaut?
was ist 'iSeries' (habe ich jetzt in den Titel geschrieben, lockt vielleicht die richtigen an), 
was ist 'openConnectionToAS400', anscheinend eine Methode von dir, im Internet sonst nicht zu finden,
dessen Code ist vielleicht interessant,

um welche Datenbank geht es genau, was kannst du alles zur Konfiguration erzählen, 
vielleicht irgendwas Richtung CharSet/ Encoding wichtig,
usw.

- funktioniert der Gegenweg, kannst du etwas von Java in die Datenbank schreiben, einen String "Hallo"?
wie wird dieser dann von Java ausgelesen und wie sieht er unter anderen Tools aus, die vielleicht "lalalala" korrekt darstellen?

- ganz entfernt ein Strohhalm:
speichere in der DB "abcdef..0123..", wird jedes Zeichen exakt zu irgendwas komischen in Java? 
welches du zumindest dann temporär kontrollliert zurückkodieren könntest?


----------



## Ollek (9. Dez 2011)

Wir haben hier mal rumgeforscht..
Es lag daran, dass eine falsche CCSID auf der iSeries benutzt wird.

Kann man mit dem JDBC Treiber die CCSID beim anemlden an der iSeries übergeben??


----------



## Ollek (9. Dez 2011)

Problem gelöst..

Ich habe den Connectionsstring um folgendes erweitert:


```
;translate binary=true
```

Fehler tritt nicht mehr auf...!
Danke für eure Hilfe!

:toll:


----------



## dereos (14. Dez 2011)

Ollek hat gesagt.:


> Hallo,
> 
> ich habe folgendes Problem.
> 
> ...



Hi,

schön das du eine Lösung gefunden hast 
Ich hatte letztens ein ähnliches Problem

Gruß
Thomas


----------

