# Bild in Oracle Datenbank - Grundkurs



## java_starter_dl (9. Mai 2008)

Hi!
Hab da mal eine kurze Frage:
Ich habe in einer Oracle-Tabelle ein feld mit dem Datentyp blob. Der Benutzer wählt nun ein Bild mittels eines FileChoosers aus. Dieses Bild soll in die Datenbank gespeichert werde. Ich will nicht nur den Pfad, sondern wirklich das bild in die Datenbank. Außerdem möchte ich keine preparedStatements verwenden wenn das möglich ist.

Das habe ich bis jetzt:

```
File input = jfc.getSelectedFile();
FileInputStream   fis   = new FileInputStream( input );
```

jfc ist das Objekt des FileChoosers. Jetzt muss ich doch den FileInputStream irgendwie in einen bytearray bekommen, oder? und dann irgendwie ein Update machen.
WIE?

Vielen Dank!


----------



## Niki (9. Mai 2008)

Warum willst du keine PreparedStatements verwenden? Ich kenne keine andere Lösung als mit PreparedStatement.


----------



## java_starter_dl (9. Mai 2008)

Naja, weil ich das strickt getrennt habe, ich habe die GUI Klasse wo ich das file einlese und dann habe ich die klasse QueryMaster in der ich alle meine Querys absetze. Ich möchte das nicht wirklich vermischen...


----------



## ARadauer (9. Mai 2008)

> QueryMaster


ich würd das anders strukturieren, du hast eine klasse die dir eine verbindung liefert und du hast klassen für jedes objekt das du in die db speichern und laden möchtest. diese DAOs hohlen sich dann über den verbindungsmanager (pool) eine connection uns setzen die verschiedenen querys ab.
an ein eine zentrale klasse abfragen zu schicken und die gibt dan irgendwas zurück, das halte ich für keine gute idee.


also sagen wir du hast ein preparade statement und ein File, dann sieht das so ungefähr aus


```
File f = new File("xx.txt");
		FileInputStream is = new FileInputStream(f);
		st.setBinaryStream(1, is);
```


----------



## java_starter_dl (9. Mai 2008)

Habs eh so ähnlich wie du beschrieben hast mit der Connection-Klasse und so...

Habe jetzt folgenden Code:


```
File input = jfc.getSelectedFile();
                
FileInputStream   fis   = new FileInputStream( input );
                
PreparedStatement pstmt = conn.prepareStatement("UPDATE USB_PERSONS SET UNTERSCHRIFT = ? WHERE ID = ?");

pstmt.setBinaryStream( 1, fis, (int)input.length() );
pstmt.setString(2, persnr);

pstmt.executeUpdate();
pstmt.close();
fis.close();
```

Also zuerst hole ich mir das File, dann pack ich alles in das preparedStatement, und anschlißend das executeUpdate, leider passiert dabei in der Datenbank schlichtweg nix!
Jemand eine Idee?


----------



## Niki (9. Mai 2008)

Kein commit gemacht?


----------



## Guest (9. Mai 2008)

Du hast recht, hab ich wirklich nicht gemacht, leider funktionierts aber jetzt auch noch nicht...

Nochmal mein aktueller Code...

```
File input = jfc.getSelectedFile();        
FileInputStream   fis   = new FileInputStream( input );
                
PreparedStatement pstmt = conn.prepareStatement("UPDATE USB_PERSONS SET UNTERSCHRIFT = ? WHERE ID = ?");
pstmt.setBinaryStream( 1, fis, (int)input.length() );
pstmt.setInt(2, Integer.parseInt(persnr));
pstmt.executeUpdate();
pstmt.close();
fis.close();  
conn.commit();
```


Danke nochmals!


----------



## metaltiffy (9. Mai 2008)

Ich hab da ma was vorbereitet...

ähh.. ich meine ich habe alten Code gefunden ^^


Speichern eines Bilds als BLOB in einer Datenbank


```
final Button speichernButton = new Button(shell, SWT.NONE);
speichernButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent e) {
try {
					Class.forName("oracle.jdbc.driver.OracleDriver");
	cn = DriverManager.getConnection(URL, USER, PASSWD);
	File fl = new File( "H:/Java/Datenbanktest/nemo.jpg" );                                  
	fis     = new FileInputStream( fl );
	// UPDATE Table SET Column = ? WHERE ......	
	pst = cn.prepareStatement("update DVD set BLOB_BILD = ? where DVD_Titel Like '%Nemo%'" );
	pst.setBinaryStream( 1, fis, (int)fl.length() );  
                pst.executeUpdate();
	System.out.println( fl.length() + " Bytes successfully loaded." );
				} catch (Exception ex) {
					System.out.println(ex);
					ex.printStackTrace();
				} finally {
					try {
						if (null != fis)
							fis.close();
					} catch (Exception ex) {
					}
					try {
						if (null != st)
							st.close();
					} catch (Exception ex) {
					}
					try {
						if (null != cn)
							cn.close();
					} catch (Exception ex) {
					}
				}// ende finally
			}
		});
speichernButton.setText("speichern");
speichernButton.setBounds(269, 39, 93, 23);
```


Auslesen eines Bildes und speichern


```
public File bildHolen(){
	try {
		int  var_id = 3;
            Statement st3 = cn.createStatement();  //cn ist die connection
            rs3 = st3.executeQuery("SELECT BILD FROM Table WHERE id = "+var_id); 
            if (!rs3.next()) { 
            	return new File(""); 
            } else { 
            		byte[] buffer = new byte[8192];            
            		int bytesRead = 0;             
            		is = rs3.getBinaryStream("BLOB_BILD");   
            		outFile = new File("c:/möp.jpg");            
            		fileOutputStream = new FileOutputStream(outFile);
            		while ((bytesRead = is.read(buffer)) > 0) {                
            			fileOutputStream.write(buffer, 0, bytesRead);            
            			}            
            		fileOutputStream.flush();  
		}
		catch (Exception ex){ex.printStackTrace();}
	finally {
	        try {
                                if (null != is) is.close(); 
                           } catch (Exception ex) {}
	            try {
		if (null != rs3)	
                                rs3.close();
                            } catch (Exception ex) {}
		try{
		if (null != fileOutputStream) fileOutputStream.close(); } catch (Exception ex){}
		} // ende finally		
		return outFile; 
		}
```



So lief das bei mir.. vergleich das ma mit deinem..
[/quote]


----------

