# Kann keine Daten aus ResultSet holen ?



## ich_wills_wissen (27. Jun 2006)

Hallo zusammen 

Habe gerade folgendes Problem:

Ich will aus einem resultSet Daten holen, nur klappt das irgendwie nicht:



```
ResultSet resultSet = st.executeQuery(myQuery);

			System.out.println("Results: "+resultSet.getMetaData().getColumnCount());
			
			while (resultSet.next())
			{
					System.out.println("drinnen !"); 
                                        ...
```


Das erste System.out.println liefert mir:    Results: 3
Das zweite System.out.println wird aber nie erreicht, d.h. resultSet.next() liefert immer false.

Hat jemand eine Ahnung warum das so ist, wo doch 3 Results vorhanden sind ?

Im Prinzip mache ich nur eine ganz simple Selectanfrage auf eine tabelle mit 3 Spalten:
erste Spalte: ID, wird automatisch von Cloudscape hochgezählt.

die andern beiden Spalten habe ich nach dem Shema:


```
dbcommands = "INSERT INTO FILES(FILE_NAME, XML_FILE) VALUES ('Blabla' , ? )";
			PreparedStatement ps = conn.prepareStatement(dbcommands);
			File resource = new File(SresourcesFile);
			resource.createNewFile();
			FileInputStream fis = new FileInputStream(resource);
			ps.setBinaryStream(1, fis, (int)resource.length());
			ps.executeUpdate();
```

Mit Daten gefüllt. Die Dateien welche ich speichere sind hier noch leer, später greife ich auf diese zu schreibe Daten
hinein und schreibe sie in die DB zurück.

hmmm...


ich_wills_wissen   :###


----------



## BugBott (27. Jun 2006)

Hallo Wissenswolldender ^^,


```
resultSet.getMetaData().getColumnCount();
```
liefert die Anzahl der Spalten des ResultSet NICHT die Anzahl der Zeilen.

In deinem Fall würde ich einfach mal darauf Tippen das vielleicht das Query nicht in Ordnung ist.....
Falsche where-Bedingung oder ähnliches.

Das würde erklären warum die Spaltenanzahl 3 ist und next() einen unwahren Wert zurückliefert.

mfg BugBott


----------



## ich_wills_wissen (27. Jun 2006)

Danke für Deine Antwort, das hilft mir schonmal weiter.

Bin jetzt soweit, daß alles in die DB geschrieben wird. Was ich noch nicht hinbekomme habe ist
eine Datei wieder auszulesen.

So trage ich die Datei ein:


```
dbcommands = "INSERT INTO FILES(FILE_NAME, XML_FILE) VALUES ('NameDerDatei' , ? )";
			PreparedStatement ps = conn.prepareStatement(dbcommands);
			File resource = new File(SresourcesFile);
			resource.createNewFile();
			FileInputStream fis = new FileInputStream(resource);
			ps.setBinaryStream(1, fis, (int)resource.length());
			ps.execute();
			fis.close();
			ps.close();
			conn.commit();
```

Ein Auslesen mit:

```
File f = (File) resultSet.getObject("XML_FILE"));
```

funktioniert leider nicht.

Ich bin gerade am grübeln wie ich an die Daten wieder drankomme...  ???:L


----------



## Murray (27. Jun 2006)

Mit 

```
resultSet.getBinaryStream( "XML_FILE");
```
bekommst einen InputStream, aus dem Du die (Binär-)Daten lesen kannst.


----------



## ich_wills_wissen (27. Jun 2006)

Hallo Murray, 

danke für Deine Hilfe !

Ich schreibe mir die Daten in eine Temp-datei, leider bekomme ich da aber nur
Buchstabensalat zu sehen, wenn ich die Datei mit einem Editor öffne.. 

Mein code: 



> InputStream is = resultSet.getBinaryStream("XML_FILE");
> 
> StringBuffer sb = new StringBuffer();
> 
> ...



Alles was ich will ist einen langen String (enthält xml) in die DB schreiben. 
Da der String im Laufe der Zeit immer länger wird habe ich mich für den Datentyp Blob 
für diese Spalte in der Tabelle entschieden, in der ich meine Daten speichern will.
Was mich an meiner Lösung stört ist daß ich ein temp-file benötige, am liebsten 
wäre es mir ich könnte direkt einen String hineinschieben und auch wieder herausholen.
Aber das geht aufgrund der Länge nicht, denn dann müsste ich ja Varchar nehmen, oder sehe ich das falsch ?


----------



## Murray (27. Jun 2006)

1. Ein BLOB enthält - im Gegensatz zum CLOB - Binärdaten, daher ist ein FileWriter zum Schreiben nicht geeignet, nimm lieber einen FileOutputStream, dann sollte es auch keinen Buchstabensalat mehr geben

2. Wenn Du zum Auslesen keine temporäre Datei anlegen willst, dann verwende doch einen ByteArrayOutputStream


----------



## ich_wills_wissen (27. Jun 2006)

Punkt 2) Super, genau was ich gesucht habe, vielen Dank !

Dann brauche ich ja zum Einlesen (beim Schreiben in die DB) ebenfalls keine Datei welche Text enthält, sondern
kann den Text als String direkt mit einem ByteArrayInputStream direkt in die DB schreiben.
Wie das genau geht weiß ich noch nicht genau, aber ich habe da eine Idee


----------



## ich_wills_wissen (27. Jun 2006)

uffa.. meine Idee war Mist:


```
dbcommands = "INSERT INTO FILES(FILE_NAME, XML_FILE) VALUES ('"+ SresourcesFile +"' , ? )";
			PreparedStatement ps = conn.prepareStatement(dbcommands);
			String abc = "dies ist ein Teststring";
			ByteArrayInputStream bais = new ByteArrayInputStream(abc.getBytes());
			ps.setAsciiStream(1, bais, abc.length());
			ps.execute();
```

liefert:


```
SQL Exception: An attempt was made to get a data value of type 'BLOB' from a data value of type 'java.io.InputStream(ASCII)'.
```

Das kann doch nicht so schwer sein..  :bahnhof:  :x


----------



## Murray (27. Jun 2006)

Vermutlich solltest Du wie in Deinem ersten Ansatz setBinaryStream verwenden; setAsciiStream ist nicht für Binärdaten gemacht.


----------



## ich_wills_wissen (27. Jun 2006)

Das habe ich auch versucht, aber ich bekomme schonwieder nur Buchstabensalat.

Ich verstehe das nicht, die Tabelle hat 3 Spalten,
in die erste trägt Cloudspace selbst die ID ein, danach trage ich in Spalte 2 eine kurze Info
ein (um welche Daten es sich handelt, z.B. Resourcen.xml) und in Spalte 3 sollte der teststring bzw die Daten stehen..

Stattdessen ist die Ausgabe auf der Konsole wie folgt:


```
resultSet:  1 Resources.xml
Cni> <rBcugnnUdt>tp/wsre.idmd:00RTBoUdt/evcsBoUdt<uluhneUdpae
 ulamit>tp/wsre.idmd:00RTRsuc/evcsRsucLs<ulamit> <ealTgantnm0:0/ealTgantnm
 tgantnm0:0/aFegAU> <ealFn>0/ealFn> <ns>0/ns><Cni>
```

Die 1 ist richtig ( ID ), Resources.xml ist ebenfalls richtig, nur das was danach kommt ist für mich nicht nachvollziehbar..


----------



## Murray (27. Jun 2006)

Ich würde erstmal die Dateien weglassen und es mit den ByteArrayStreams versuchen. Wenn das ohne "Buchstabensalat" klappt, kannst Du immer noch mit Dateien arbeiten.


----------



## ich_wills_wissen (27. Jun 2006)

Endlich, eeeeeendlich hat es geklappt und ich habe diesen *§$@&|µ - Fehler gefunden ! Jippieh !!!   

Der Grund warum ich immer Buchstabensalat bekommen habe war, daß das Bytearray falschrum eingelesen wurde !
Ist mir beim debuggen aufgefallen und habs jetzt endlich so, daß es funktioniert !


YUUUHUUUU !!!  :lol:  :applaus:   


Gruß und nochmals Danke für die Hilfe !!!!!

ich_wills_wissen


----------

