Firebirdsql FBBlob

Hallo Zusammen,

seit 3 Stunden sitze ich an einem Problem:

  • wir haben einen Firebird Server, der verschiedene Datenfelder in einer Tabelle hat. Darunter auch dieses BLOB-Format. Ich habe einfach eine ArrayList mit HashMaps reingesteckt. Jedenfalls speichere ich diese ArrayList per SQL in das Datenfeld ‘blobvalue’, als normales value zur Info kommt ‘–Daten–’ dort rein.

Über den IBExpert sehe ich in der Spalte dann auch die ArrayList.

Nun will ich die Daten wieder rausholen. Den Blob hole ich dadurch rein.
Die map ist übrigens eine Hashmap mit ,.

while (resultset.next()) {
			key = resultset.getString("pid_key");
			value = resultset.getString("pid_value");
			if (value.equals("--Daten--")){
				blob = resultset.getBlob("blobvalue");
				map.put(key, blob);
			} else {				
				map.put(key, value);
			}
		}

so, in der weiteren Verarbeitung hole ich mir den Blob wert.

if (map.get(wert) instanceof Blob){
		    		   FBBlob temp = (FBBlob) map.get(wert);

Aufgrund von map.get(wert).getClass habe ich herausgefunden, dass es sich um ein FBBlob handelt. Leider kriege ich mit allen möglichen Methoden da keine Werte wieder raus.
Kann mir da jemand helfen?
Viele Grüsse,
Wurst

Hey

Um was für einen Server handelt es sich den?
Also in Mysql kannste dir einfach den Blob holen
Blob blob = rs.getBlob(“Data”);
und danach musste ein wenig rumbasteln
Viele versuchen über einen byteArray wieder ein String zu machen
solange nur ein String drin steht ist es ja kein problem…
http://shitmores.blogspot.de/2007/06/convert-javasqlblob-to-string.html

mfg

Vielen Dank für den Tipp, leider habe ich da das selbe Problem.
Wie gesagt, haben wir hier einen FireBird. Das Problem ist, dass ich den Blob aus einer HashMap hole als . Somit muss der Blob erstmal gecastet werden:
Blob blob = (Blob) map.get(wert);

Leider kann in der HashMap ein String, eine ArrayList oder sonstwas stehen. Von daher hatte ich das so flexibel gehalten. Aber als Fehler kommt immer:

[SIZE=2][SIZE=2]org.firebirdsql.jdbc.FBSQLException[/SIZE]
[LEFT][SIZE=2]: GDS Exception. 335544332. invalid transaction handle (expecting explicit transaction start)[/SIZE][/LEFT]

[LEFT][SIZE=2]at org.firebirdsql.jdbc.FBBlob.getInfo([/SIZE][/LEFT]

[LEFT][SIZE=2]FBBlob.java:227[/SIZE][SIZE=2])[/SIZE]
[SIZE=2]at org.firebirdsql.jdbc.FBBlob.length([/SIZE][SIZE=2]FBBlob.java:247[/SIZE][SIZE=2])[/SIZE][/LEFT]
[/SIZE]

Also, ich kann jetzt den Blob auslesen und als String anzeigen lassen. Allerdings zeigt er mir das typische ArrayList-Format an {[…, …, …][…]}
Jetzt einen Converter per Hand zu machen der den String als ArrayList macht fände ich komisch. Ist es nicht möglich, diesen Block jetzt direkt als ArrayList zu machen?

Wenn die List nicht gerade als String (bzw. deren toString()) in das Blob geschrieben wurde, scheint sie ja als Collection Objekt erkannt zu werden und man sollte das Objekt nach List casten können.

FBBlob an sich und die Fehlermeldung lassen auf sehr spezielle Behandlung mit dem Firebird-Framework schließen,
normales JDBC-/ SQL-Wissen hilft dazu nicht viel weiter, habe den Thementitel geändert, aber ob das jemand kennt?

hast du keine umfassenden Tutorials/ Beispiele zum Umgang mit Firebird, Speichern + Laden?

wie speicherst du denn bisher in der DB? nach allem bisherigen kann das doch nicht einfach so passieren,
da muss doch auch FBBlob usw. mitspielen

Ich würde mal sagen dein Problem ist das du den Blob versuchst zu verwenden nachdem die Verbindung zur Datenbank geschlossen wurde oder eine neue Transaktion auf der Verbindung gestartet wurde. Die Blob Objekt sind anscheinend nur während der Transaktion gültig in der sie erstellt wurden.

wie weit seit ihr den jetzt?
bekommt ihr immernoch die selbe excpetion?

Danke für die vielen guten Antworten und Entschuldigung, dass ich jetzt erst antworte :(. Die Verbindung wird nicht geschlossen, aber ich habe dies nun, indem ich einen StringBuffer speicher und folgendermaßen den StringBuffer wieder auslese. Allerdings hab ich die ArrayList dann in ein einfaches , und ; - Trennungs-CSV Format gemacht, so das ich mir dann nach dem zurückholen wieder eine Liste zurückbauen kann.
Nochmals danke, natürlich wäre ich über eine ‘richtige’ Lösung zufriedener gewesen, aber es gibt leider keine richtigen Tutorials die das zeigen…

blob = resultset.getBlob("blobvalue");
				int offset = -1;
				int chunkSize = 1024;
				long blobLength = blob.length();
				if (chunkSize > blobLength) {
					chunkSize = (int) blobLength;
				}
				char buffer[] = new char[chunkSize];
				StringBuilder stringBuffer = new StringBuilder();
				Reader reader = new InputStreamReader(blob.getBinaryStream());
				while ((offset = reader.read(buffer)) != -1) {
					stringBuffer.append(buffer, 0, offset);
				}
				// stringBuffer.append("!!");
				// stringBuffer.append(resultset.getString("table_style"));

				map.put(key, stringBuffer);