# Bild in Datenbank speichern



## Unbekannt (10. Aug 2005)

Hi Leute
Hab ein Problem. Ich soll Bilder in einer Datenbank speichern. Hinterher soll ich die Bilder aus der Datenbank wieder auslesen und auf einem Fenster ausgeben. Das funktioniert jedoch nicht.

PreparedStatement ps = con.prepareStatement(q);
ps.setBinaryStream(1, new FileInputStream(f), (int) new File(f).length());
ps.executeUpdate();
ps.close();

Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery(s);
byte[] picBytes = rset.getBytes(1); 
ImageIcon image = new ImageIcon(picBytes);
img = image.getImage();
stmt.close();

Wie kann ich das Bild dann ausgeben?

Danke schon mal im vorraus.


----------



## Bleiglanz (10. Aug 2005)

WAS funktioniert nicht?



> Wie kann ich das Bild dann ausgeben?


Auf dem Bildschirm? Was meinst du mit "ausgeben"??


----------



## Unbekannt (10. Aug 2005)

Das Bild erscheint nicht auf dem Fenster.


----------



## Bleiglanz (10. Aug 2005)

auf welchem Fenster?

Exceptions?


Code?


----------



## Unbekannt (10. Aug 2005)

Das ist das komplette Programm:

import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.io.*;
import javax.swing.ImageIcon;

public class test7 extends Frame {
    Connection con;

    Image img;

    public test7() {
        super();
    }

    public test7(String title) {
        super(title);
        init();
    }

    public void init() {
        submitImageSQL(
                "INSERT INTO Bildpfad1 VALUES(?)",
                "C:\\bulb2.gif");
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                System.exit(0);
            }
        });
        setBackground(Color.darkGray);
        setSize(200, 200);
        setVisible(true);
    }

    public void paint(Graphics g) {
        try {
            Image img = submitImageSQL("SELECT * FROM Bildpfad1");
            g.drawImage(img, getHeight() / 2, getWidth() / 2, this);

        } catch (Exception e) {
            System.out.println("Fehler 2");
        }
    }

    public static void main(String[] args) {
        new test7("test 7");
    }

    private void Kontakt() {
        try {
            Class.forName("org.hsqldb.jdbcDriver");
            con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/",
                    "SA", "");
        } catch (Exception e) {

        }
    }

    public void submitImageSQL(String q, String f) {
        try {
            Kontakt();
            PreparedStatement ps = con.prepareStatement(q);
            ps.setBinaryStream(1, new FileInputStream(f), (int) new File(f)
                    .length());
            ps.executeUpdate();
            ps.close();
        } catch (Exception e) {
            System.out.println("Fehler");
        }
    }

    public Image submitImageSQL(String s) throws Exception {
        Kontakt();
        Statement stmt = con.createStatement();
        ResultSet rset = stmt.executeQuery(s);
        byte[] picBytes = rset.getBytes("Pfad");
        ImageIcon image = new ImageIcon(picBytes);
        img = image.getImage();
        stmt.close();
        return img;
    }
}


----------



## Unbekannt (10. Aug 2005)

Jetzt tritt plötzlich ein Fehler in folgender Zeile auf:

byte[] picBytes = rset.getBytes("Pfad");


----------



## Bleiglanz (10. Aug 2005)

WELCHER?


----------



## Bleiglanz (10. Aug 2005)

```
catch (Exception e) {

}
```

das ist MIST

schreib wenigstens ein e.printStackTrace() rein


----------



## Unbekannt (10. Aug 2005)

So lautet der Fehler:

java.sql.SQLException: No data is available
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.jdbcResultSet.checkAvailable(Unknown Source)
	at org.hsqldb.jdbc.jdbcResultSet.getObject(Unknown Source)
	at org.hsqldb.jdbc.jdbcResultSet.getBytes(Unknown Source)
	at test7.test7.submitImageSQL(test7.java:83)
	at test7.test7.init(test7.java:33)
	at test7.test7.<init>(test7.java:20)
	at test7.test7.main(test7.java:53)


----------



## Unbekannt (10. Aug 2005)

Die Datenbank sagt mir aber es sind Daten vorhanden.


----------



## Bleiglanz (10. Aug 2005)

wie sieht denn deine db aus

speicherst du nur den Pfad? 

oder wirklich einen binären BLOB??


----------



## Unbekannt (10. Aug 2005)

Ich speichere keine Pfade


----------



## Bleiglanz (10. Aug 2005)

und was ist das??

 "INSERT INTO Bildpfad1 VALUES(?)",
"C:\\bulb2.gif");


----------



## Unbekannt (10. Aug 2005)

In der Datenbank steht dann komischerweise aber der Pfad nicht sondern lauter Zaheln und Buchstaben.


----------



## Bleiglanz (10. Aug 2005)

welchen datentyp hat denn die einzige spalte von Bildpfad1


----------



## Unbekannt (10. Aug 2005)

VARCHAR(1000000) und ist al Primary Key gekennzeichnet


----------



## Bleiglanz (10. Aug 2005)

und was soll da drin stehen?

BTW: VARCHAR(1000000) als Primary Key? Ist das eine gute Idee?


----------



## Unbekannt (10. Aug 2005)

In der Datenbank steht dann

47494638396128002800c20000fffffff 

usw. drin


----------



## Unbekannt (10. Aug 2005)

Wie müsste denn die Datenbank angelegt werden, damit sie Bilder speichert? Und wie schickt man dann die Bilder hin? Ich hab das Gefühl, dass die Bilder nicht mal richtig in der Datenbank gespeichert werden.


----------



## Bleiglanz (10. Aug 2005)

google nach

jdbc BLOB image


----------



## Unbekannt (10. Aug 2005)

Also ich habe jetzt eine Datenbaktabelle mit folgendem Befehl erzeugt:
CREATE TABLE dataobject
    (
        id INTEGER NOT NULL,
        data BINARY,
        PRIMARY KEY(id)
    );

Danach musste ich ein wenig am Quelltext ändern:

PreparedStatement pstmt = conn.prepareStatement(
        "INSERT INTO dataobject VALUES (1, ?);");
    pstmt.setBytes(1, "C:\\bulb2.gif");
    pstmt.execute();

Statement stm = conn.createStatement();
    ResultSet rs = stm.executeQuery(
        "SELECT data from dataobject where id = 1;");
    rs.next();
    imageDataByteArray = rs.getBytes(1);

Aber jetzt kommen nicht einmal mehr Daten in der Datenbank an.

Beim folgenden Link hab ich die Sachen gefunden.
http://www.myjavaserver.com/exec/.ado5GtpKLwzNf2CZvwBFfNjLDwyZnxzT9vB1j3BM1JBPfwBMuwBVHwp0f2y


----------



## Bleiglanz (10. Aug 2005)

pstmt.setBytes(1, "C:\\bulb2.gif"); 

völliger Unsinn!

pstmt.setBytes(1, imageDataByteArray); // da muss ein bytearray her

nur zu deiner Info:

es gibt keine Magie, die dir aus dem C:\\bulb.gif automatisch ein byte[] machen kann


----------



## Unbekannt (10. Aug 2005)

Ich hatte in den Zeilen davor folgendes geschrieben:
            byte[] Byte = null;
            String str = "C:\\bulb2.gif";
            int i = str.length();
            char[] c = str.toCharArray();
            while (i > 0) {
                Byte_ += c;
                i--;
            }

Aber trotzdem funktioniert es nicht. Hab ich da irgend etwas falsch gemacht?_


----------



## Unbekannt (10. Aug 2005)

Für die folgende Zeile bekomme ich eine Fehlermeldung:

Byte_ += c;

java.lang.NullPointerException
	at test7.test7.submitImageSQL(test7.java:83)
	at test7.test7.init(test7.java:25)
	at test7.test7.<init>(test7.java:21)
	at test7.test7.main(test7.java:56)

Hab ich da irgend etwas falsch gemacht?_


----------



## Bleiglanz (10. Aug 2005)

ich hör jetzt auf, ich lass mich nicht veralbern...


----------



## Unbekannt (10. Aug 2005)

Ich verarsch dich nicht. Die Fehler sind tatsächlich da. Hab nur noch nicht so viel Erfahrung mit Java.


----------



## Bleiglanz (10. Aug 2005)

dann lerns erst mal, warum fängst du gleich mit sowas an; das ist noch zu schwierig für dich


----------

