# Sybase IMAGE-Daten zu MySQL als BLOB schreiben.



## Gast (6. Sep 2006)

Hallo Leute!

Ich hab folgendes Problem, ich möchte von einer Sybase Datenbank in welcher Bilder gespeichert sind (IMAGE) die Binären IMAGE Daten auslesen und als BLOB in einer MYSQL speichern.

Ich hab bisher versucht die Binärdaten als String auszulesen und dann durch eine SQL CAST("String" AS BINARY)-Anweisung die Daten in die BLOB Spalte meiner MySQL DB zu speichern. Wenn ich dies so tue, bekomm ich keine Fehlermeldungen aber ich kann mir die BLOB-Daten nicht mehr als Bild ansehen.

Das Problem liegt da, dass Sybase keinen BLOB-Datentyp kennt und diesen auch nicht unterstützt. Darum hab ich es versucht folgendermaßen zu lösen:


*//Selektiere Daten aus Sybase DB*

          ....

```
rs = stmtSel.executeQuery();
	     id = attributs.getId();
			     
	     if(rs.next()){
		     attributs.setId(rs.getInt("attachment_id"));
		     attributs.setInputStream(rs.getBinaryStream("data"));
		     fillBinary(BINARYDATA_INS, attributs);
                     }
```
*//Schreibe Daten in MySQL*

```
public void fillBinary(String qryIns, Attributs attributs) throws ClassNotFoundException, SQLException, NoDataContainedException, IOException{
		
	conMySQL = DBConnection.dbMysql(DBConnection.MySQLURL);	
	PreparedStatement stmtIns = conMySQL.prepareStatement(qryIns);
		
                if((attributs.getInputStream() == null)){
	    	 throw new NoDataContainedException("No Datas contained in the column 'Data'");
               }	     
	     stmtIns.setInt(1,attributs.getId());
	     stmtIns.setInt(1,attributs.getId());
	     byte[] buff = new byte[8000];
	     int len;
	     while( 0 < (len = attributs.getInputStream().read( buff )) )   	 
	     stmtIns.setBinaryStream(2,attributs.getInputStream(),len ); 		     
	    
                     stmtIns.executeUpdate();
		    
	     conMySQL.close();
}
```

Wenn ich den Quellcode so ausführe, bekomm ich aber immer folgende Fehlermeldung:

_java.io.IOException: JZ0I9: Dieser InputStream wurde bereits geschlossen._


Hat irgend jemand eine Idee woran das liegen könnte? Oder bin ich auf diese Art und Weise komplett auf dem Holzweg, wenn ja, gibt es vielleicht eine andere Möglichkeit?

Ich bin für jede Hilfe dankbar.

Gruss
Markus


----------



## SlaterB (6. Sep 2006)

Mit len = attributs.getInputStream().read( buff )
liest du doch Daten einmalig in den Buffer buff.

Ich weiß nicht ob danach der Stream schon geschlossen ist,
aber die Daten im Buffer sollten ja wohl auf keinen Fall noch mal geladen werden?

Schreibe den Buffer in die Datenbank oder benutzte stream.available() statt len auszulesen?


----------



## Gast (6. Sep 2006)

Ja, du hattest recht. War mir garnicht aufgefallen. 
Jedenfalls jetzt läuft es. 
Vielen Dank für die Hilfe!

Gruss
Markus


----------

