Bild in Blob einer oracle-DB einfügen (veraltete Methode)

AKST

Erfahrenes Mitglied
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:

Code:
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?

Code:
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(); 
  }
}
 
Hallo!

Tabelle images anlegen:
Code:
SQL> create table images (id int, image_data long raw);

Tabelle wurde angelegt.

Ich würde dir empfehlen das JDBC 3 API (DataSource etc.) und auf Oracle Seite den THIN Treiber statt des lahmen Oracle Call Interfaces (OCI)'s.... dann klappt's auch mit den BinaryInputStreams ;)

Code:
/*
 * Created on 26.01.2005@19:44:22
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import oracle.jdbc.pool.OracleDataSource;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class OracleBlobTest {

    public static void main(String[] args) {
        try {
            Thread.currentThread().getContextClassLoader().loadClass(
                    "oracle.jdbc.OracleDriver").newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            OracleDataSource ods = new OracleDataSource();
            ods.setDatabaseName("orcl");
            ods.setUser("asw");
            ods.setPassword("asw");
            ods.setDriverType("thin");
            ods.setServerName("localhost");
            ods.setPortNumber(1521);

            Connection con = ods.getConnection();

            File file = new File("c:/Beispiel.jpg");

            //In DB Schreiben
            PreparedStatement pstmt = con
                    .prepareStatement("insert into images(id,image_data) values (?,?)");
            pstmt.setInt(1,1);
            pstmt.setBinaryStream(2, new BufferedInputStream(
                    new FileInputStream(file)), (int) file.length());
            pstmt.execute();
            con.commit();

            Statement stmt = con.createStatement();
            ResultSet rs = stmt
                    .executeQuery("SELECT id, image_data FROM images");

            if (!rs.next())
                throw new RuntimeException("we have a problem ...");
            final BufferedImage img = ImageIO.read(rs
                    .getBinaryStream("image_data"));
            JFrame frm = new JFrame() {
                {
                    setDefaultCloseOperation(EXIT_ON_CLOSE);
                    getContentPane().add(new JLabel(new ImageIcon(img)));
                    pack();
                }
            };
            frm.setVisible(true);
            con.close();

        } catch (SQLException e1) {
            e1.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

HTH,
Gruß Tom
 
Hallo tom,

ih verwende auch den neuen Oracle-Thin Treiber. Das Beispiel ist von einer Internetseite. Ich habe das nur für meine Zwecke modifiziert. Ich werde mir dein Beispiel Morgen mal anschauen.


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

Code:
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";
  }

Code:
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());     
      }
    }
  }
 
Zuletzt bearbeitet:
Zurück