[JAVA] Images aus MS Access DB über odbc als BLOB holen

AleX

Erfahrenes Mitglied
hi leute,
hab mal wieder so ein besch**** problem in java, an dem ich schon 4tage arbeite
und einfach nicht weiterkomme. :rolleyes:

Folgendes Problem habe ich:
Meine Anwendung connectet per odbc auf die access DB
dbconnection = DriverManager.getConnection("jdbc:eek:dbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:/accessdb.mdb", "", "");
^- somit muss die Datenbank dem system nicht fest angegeben werden

So, hole mir jetzt meine Daten aus einer Tabelle:
Code:
Statement stmt = dbconnection.createStatement();
String query = "SELECT *FROM Maschinenliste";

ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
vecTemp.add(rs.getString("PGR"));
...

und jetzt muss ich noch aus einer anderen Tabelle Bilder holen.
Hab das ganz nach dem Tutorial "BLOB to Image" @ java.sun (link) gemacht, dennoch bekomme ich immer "java.lang.UnsupportedOperationException" als Exception bei folgendem code:
Code:
Blob blob = rs.getBlob("Bild");
int iLength = (int) (blob.length());
ImageIcon ii = new ImageIcon(blob.getBytes(1, iLength));
JLabel jlImage = new JLabel();
jlImage.setIcon(ii);

Bitte um Hilfe, ist wirklich dringend und ich bin kurz vorm Verzweifeln... :rolleyes:

Schon mal danke im Vorraus
aleX
 

Thomas Darimont

Erfahrenes Mitglied
Servus!

Wenn du die Bilder als OLE OBjekte per Drag'n'Drop in die DB gebracht hast, hast du keine Chance (ausser vielleicht mittels Nativer Methoden) auf die "tatsächlichen" Bilddaten des OLE Objektes zuzugreifen, da diese nicht nur die Bildinformationen sondern Tonnen von weiteren anderen Daten (für OLE) mitschleppen ...

anders siehts jedoch aus, wenn du die Bilder (per Java) mittels eines FileOutputStreams (also manuell) in die DB überführt hast ...

Bsp.:

//Musst da noch Pfade anpassen ...
//DB liegt im Anhang ...
//In diesem TESTBEISPIEL musst du die tabelle1 in der MS ACCESS Datenbank nach JEDEM(!!!) Programmlauf leeren ... sonst gibts ne SQL Exception ... sorry, hatte keine Lust mehr ;-)

Code:
import java.awt.*;
import javax.swing.*;
import java.sql.*;
import java.awt.event.*;
import java.io.*;



/*
 * ImageFromDB.java
 *
 * Created on 16. Mai 2003, 19:05
 */

/**
 *
 * @author  Administrator
 */
public class ImageFromDB extends javax.swing.JFrame {
    
    Image img = null;
    
    /** Creates new form ImageFromDB */
    public ImageFromDB() {
        initComponents();
        this.setSize(512,384);
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        jPanel2 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel2.setLayout(new java.awt.BorderLayout());

        jPanel2.setBackground(new java.awt.Color(204, 255, 204));
        jPanel2.setPreferredSize(new java.awt.Dimension(10, 150));
        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jPanel2.add(jButton1, java.awt.BorderLayout.SOUTH);

        getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH);

        jPanel1.setBackground(new java.awt.Color(153, 204, 255));
        jPanel1.setPreferredSize(new java.awt.Dimension(10, 300));
        getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // Add your handling code here:
        
        File f = new File("F:\\Dokumente und Einstellungen\\Administrator\\Eigene Dateien\\Eigene Bilder\\Beispiel.jpg");
        
        try{ //ClassNotFound, SQLException ...
        
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        
        Connection con = DriverManager.getConnection("jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=F:/Dokumente und Einstellungen/Administrator/Eigene Dateien/db5.mdb","Administrator","");
                       
        //Bild in DB Speichern ...
        
        PreparedStatement ps = con.prepareStatement("INSERT INTO tabelle1 VALUES(1,?);");
        ps.setBinaryStream(1,new FileInputStream(f),(int)f.length());
        ps.execute();
        ps.close();
        
        //Bild aus DB laden ...
        
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT image FROM tabelle1;");
        rs.next();
        byte[] bytes = rs.getBytes(1);

        //Bild anzeigen ...
        
        Image img = this.getToolkit().getDefaultToolkit().createImage(bytes);

        MediaTracker mt = new MediaTracker(this);
        
        mt.addImage(img,0);
        
        mt.waitForAll();
        
        
        //new FileOutputStream("c:\\tttttttest.jpg").write(bytes);
        //this.jPanel1.getGraphics().drawImage(new ImageIcon( img ).getImage(),0,0,this);
        this.jPanel1.getGraphics().drawImage(img,0,0,this);
        
        System.out.println("müsste fertig sein...");
        
        
        rs.close();
        stmt.close();
        con.close();
        
        
        }catch(ClassNotFoundException cnfe){
            System.out.println(cnfe);
        }catch(SQLException sqle){
            System.out.println(sqle);
        }catch(IOException ioe){
            System.out.println(ioe);
        }catch(InterruptedException ie){
            System.out.println(ie);
        }
        
                
         
        
        
        
    }
    
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new ImageFromDB().show();
    }
    
    
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration
    
}

Ergo:

Vorgehensweise wie folgt:

-Bild mittels FileOutputStream in DB schrieben ...
-... mit rs.getBytes die Image Bytes laden, dann mittel createImmage(bytes) ein Image erzeugen
-Image anzeigen ...

Gruss Tom
 

Anhänge

  • db5.zip
    28,6 KB · Aufrufe: 39
Zuletzt bearbeitet:

AleX

Erfahrenes Mitglied
hmmm, erst mal danke.

Allerdings ist es leider so, dass es sich um eine DB eines Freundes
handelt und ich auch nicht weis wie er die Bilder importiert hat.
Aber eines ist sicher, das hat er bestimmt nicht über ein java-app gemacht. :(

Gibt es sonst vielleicht noch irgendeine Möglichkeit auf die Bilder zuzugreifen? (mal abgesehen von native code...)
 

Thomas Darimont

Erfahrenes Mitglied
Servus!

Leider ist mir auf meinem Streifzug durch dclj und diversen Java Foren nichts anderes begegnet ...

Sorry,

Gruss Tom