# Blob in Oracle-DB einfügen (veraltete Methode)



## ak (26. Jan 2005)

Hallo Leute,

ich möchte ein Bild in ein blobfeld einer Oracle-DB per JDBC einfügen. Ich habe da ein Beispiel im Netzt gefunden, welches auch funktioniert.
Mein Problem ist, dass in diesem Beispiel eine veraltete Methode vorkommt und ich nicht weiss, wie ich diese ersetzen soll. Hier mal die veraltete Methode:


```
BLOB blob = ((OracleResultSet)rset).getBLOB (1);
OutputStream ostream = blob.getBinaryOutputStream ();  //getBinaryOutputStream  ist deprecated
```

Hier mal das komplette Beispiel. Würdet ihr das evtl. anders machen? Wenn ja wie? wie kann ich das von oracle unabhängig machen, so dass es auch bei anderen DB's mit Blobs funktioniert?


```
import java.sql.*;
import java.io.*;
import java.util.*;

// Importing the Oracle Jdbc driver package makes the code more readable
import oracle.jdbc.driver.*;

//needed for new CLOB and BLOB classes
import oracle.sql.*;

public class LobExample
{
  public static void main (String args [])
       throws Exception
  {
    // Register the Oracle JDBC driver
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

    // Connect to the database
    // You can put a database name after the @ sign in the connection URL.
    Connection conn =
      DriverManager.getConnection ("jdbc:oracle:oci8:@", "scott", "tiger");

    // It's faster when auto commit is off
    conn.setAutoCommit (false);

    // Create a Statement
    Statement stmt = conn.createStatement ();

    try
    {
      stmt.execute ("drop table persons");
    }
    catch (SQLException e)
    {
      // An exception could be raised here if the table did not exist already.
    }

    // Create a table containing a BLOB and a CLOB
    stmt.execute ("create table persons (name varchar2 (30), picture blob)");
    
    // Populate the table
    stmt.execute ("insert into persons values ('John', EMPTY_BLOB())");
    
    // Select the BLOB 
    ResultSet rset = stmt.executeQuery ("select picture from persons where name 
= 'John'");
    if (rset.next ())
    {
      // Get the BLOB locator from the table
      BLOB blob = ((OracleResultSet)rset).getBLOB (1);

      // Declare a file handler for the john.gif file
      File binaryFile = new File ("john.gif");

      // Create a FileInputStream object to read the contents of the GIF file
      FileInputStream istream = new FileInputStream (binaryFile);

      // Create an OutputStram object to write the BLOB as a stream
      OutputStream ostream = blob.getBinaryOutputStream ();

      // Create a tempory buffer  
      byte[] buffer = new byte[1024];
      int length = 0;

      // Use the read() method to read the GIF file to the byte 
      // array buffer, then use the write() method to write it to 
      // the BLOB.
      while ((length = istream.read(buffer)) != -1)
        ostream.write(buffer, 0, length);

      // Close the inputstream and outputstream
      istream.close();
      ostream.close();

      // Check the BLOB size
      System.out.println ("Number of bytes written = "+blob.length());
    }

    // Close all resources
    rset.close();
    stmt.close();
    conn.close(); 
  }
}
```


----------



## ak (27. Jan 2005)

Das obere Beispiel ist aus dem Netz.

So habe ich es jetzt gemacht, das dürfte auch bei nicht Oracle-DB's funktionieren:


```
public String oeffne_DB(){
    String oracleURL="jdbc:oracle:thin:@anton:1521:kurse";
    
    //  oracle-Treiber laden
    try{
      Class.forName("oracle.jdbc.driver.OracleDriver");  
    }catch(ClassNotFoundException err){
      return err.toString();  
    }
    
    try{
      //Connection öffnen
      connection = DriverManager.getConnection(oracleURL, "Scott", "Tiger");
      
    }catch(SQLException err){
      return err.toString();
    }
    
    return "ok";
  }
```


```
public void save_pic_to_blob2(Dozenten_BEAN doz, File image){
    //ein bild wird im blob-Feld der dozenten DB gespeichert
    
    if(oeffne_DB().equals("ok")){
         
      try {
        
        connection.setAutoCommit(false);
        Statement stmt = connection.createStatement ();
        
        // leeren Blob einfügen
        stmt.execute ("update scott.dozent set Bild= EMPTY_BLOB() " +
        		"where D_NR="+String.valueOf(doz.getDoz_ID()));
        
        // Bild per Fileinputstream in den Blob 
        try {
          PreparedStatement pre = connection.prepareStatement("update scott.dozent " +
          		"set Bild=? where D_NR="+String.valueOf(doz.getDoz_ID()));
          pre.setBinaryStream(1, new BufferedInputStream(
              new FileInputStream(image)), (int) image.length());
         
          pre.executeUpdate();
          connection.commit();
          connection.close();
        } catch (FileNotFoundException e1) {
          doz.setDb_error(e1.toString());
        }
        
      }catch (SQLException e) {
        
        doz.setDb_error(doz.getDb_error()+" - "+e.toString());     
      }
    }
  }
```


----------



## Gast (11. Mrz 2005)

Guten Morgen!
Ich habe eine Frage, welche Antwort ich hier leider noch nicht gefunden habe!
Und zwar habe ich einen Quellcode, in dem zweimal "String.valueOf" vorkommt!
z.B. String.valueOf(String.valueOf(String name)).
Meine Frage jetzt, warum schreibt man das zweimal hintereinander? Hat das einen tieferen Sinn?
Würde mich über eine Antwort freuen!


----------



## Gast (12. Mrz 2005)

Sorry aber das passt mal garnicht zum Thema. Aber wo wir schon dabei sind, wo bekomme ich einen günstigen Geschirrspüler her?


----------

