# Dateien in Access speichern



## sternchen84 (27. Februar 2007)

Hallo ich habe eine Frage.
Und zwar möchte ich Dateien, z.B. WordDokumente in einer Access Datenbank speichern.
Die Datei soll im JFileChooser ausgewählt werden können und dann mit Hilfe von SQL in der Datenbank gespeichert werden. Klappt leider alles nicht so wirklich.
Kann mir jemand helfen?

Gruß

sternchen


----------



## MaLb (27. Februar 2007)

Ich glaube nicht dass das so einfach geht. Access speichert Binärdateien als OLE...
Reicht nicht einfach die Referenz?


----------



## sternchen84 (27. Februar 2007)

Hallo,

leider reicht die Referenz nicht. Das Access Datein als OLE-speichert ist mir bekannt. Direkt lassen sich so ja auch doc oder andere Dokumente dort speichern, nur habe ich noch keinen Weg gefunden dies über Java zu realisieren. Habe es mit nem FileInputStream und setBinaryStream versucht, bekomme jedoch immer Fehlermeldungen.


----------



## zeja (27. Februar 2007)

Lies doch deine Datei in ein byte array ein und speichere dieses als blob in der Datenbank.


----------



## sternchen84 (27. Februar 2007)

das geht? Ich kann sie so auch wieder auslesen?

mh könntest du mir genauer sagen wie das funktioniert?


----------



## zeja (27. Februar 2007)

Ich bin gerade auf der Arbeit und habe nicht so viel Zeit.

Ein BLOB steht ja für Binary Large Object. Daher kann man binäre Daten auch einfach darin ablegen. Dafür gibt es die Methoden setBytes(pos, byte []) und byte [] getBytes(pos, length)
und getLength() um die Länge zu bestimmen.

Das einzige was dann noch fehlt ist die Datei in ein byte [] einzulesen und wiederherzustellen. Dazu solltest du aber Beispiele im Internet finden können. (FileReader/Writer, ByteArrayInput/OutputStream)


----------



## sternchen84 (27. Februar 2007)

danke werde das mal probieren


----------



## jeipack (27. Februar 2007)

```
connection.prepareStatement("INSERT INTO mytbl ('myfield')  VALUES(?);").setBytes(1, byte[]);
```

und mit einem FileInputStream hollst du dir das byte[].

Das wärs denn eigentlich auch schon. 

Gruss

Oh, inzwischen hat schon zeja geantwortet.. naja vielleicht hilft dir mein code trozdem noch ein bisschen ^^


----------



## sternchen84 (27. Februar 2007)

vielen dank jeipack.

Also in java bekomme ich nun keine Fehlermeldung mehr.
In Access scheint es aber noch nicht drin zu sein. Aber es ist doch richtig das ich dort das entsprechende Feld als OLE angebe oder?


----------



## zeja (27. Februar 2007)

Access kann im gegensatz z.B. zum MySQLBrowser solche Blobs nicht richtig interpretieren und zeigt sie somit auch nicht an. Du müsstest nur sowas wie "Long binary-Daten" in dem Feld stehen haben. Ist bei mir zumindest so. Ob die Daten wirkich da sind zeigt sich nur wenn man sie wieder ausliest.


----------



## jeipack (27. Februar 2007)

Naja wenn ich erlich bin hab ich noch nie aus Java eine ACCESS DB angesprochen. Bist du sicher das der ODBC Treiber richtig funktioniert? Kannst du da "normale" Daten reinschreiben/auslesen?

Auch wenn solche Tipps meistens nicht wirklich hilfreich sind: Wechsle lieber auf MySQL oder Oracle 

Und ansonsten am besten mal googlen. Da gibts bestimmt ne gute Anleitung dazu.

mfg


----------



## zeja (27. Februar 2007)

... oder auf Derby wenn du nicht extra nen Server laufen haben willst.


----------



## sternchen84 (27. Februar 2007)

Normale Daten kann ich auslesen und schreiben. Das klappt.
Naja mal schauen die einzige Möglichkeit die ich noch habe ist wohl auf SQL-Sever umzusteigen. Nur ob das da klappt?


----------



## zeja (27. Februar 2007)

Wie gesagt Derby ist auch wunderbar. Liegt genauso lokal wie Access und man braucht keinen Server sondern nur das derby.jar.

Und mit Access funktioniert das auch mit den Dateien wenn dus richtig machst.


----------



## jeipack (27. Februar 2007)

Sorry wenn ich jetzt ein bisschen ins offtopic rutsche.
Es ist heute das erste mal dass ich von Derby - Eine Datenbank die nur auf Java aufgebaut ist - höre. Wie siehts mit der Leistung aus? Bringt die was her? Und kann man die auch mit SQL ansprechen? Oder eine völlig neue Sprache?

Ist Derby für kleine Programme die ein paar Sachen abspeichern wollen ausgerichtet oder auch für grössere Angelegenheiten?

greez


----------



## Thomas Darimont (27. Februar 2007)

Hallo,



> Sorry wenn ich jetzt ein bisschen ins offtopic rutsche.
> Es ist heute das erste mal dass ich von Derby - Eine Datenbank die nur auf Java aufgebaut ist - höre. Wie siehts mit der Leistung aus? Bringt die was her? Und kann man die auch mit SQL ansprechen? Oder eine völlig neue Sprache?


Bei kleinen Anwendungen ist dei Performance von Derby mehr als ausreichend. Ja du kannst Derby mit SQL über JDBC ansprechen. (Wäje ja auch schlimm wenn nicht ;-)



> Ist Derby für kleine Programme die ein paar Sachen abspeichern wollen ausgerichtet oder auch für grössere Angelegenheiten?


Ich denke mit Derby kann man schon kleinere (unkritische) Anwendungen aufsetzen.

schau mal hier:
http://wiki.apache.org/apachecon-da...attachments/ApacheCon05usDerbyPerformance.pdf

Gruß Tom


----------



## jeipack (27. Februar 2007)

ein Tag auf tutorials.de und schon so viel gelernt  

Danke!


----------



## sternchen84 (27. Februar 2007)

danke erstmal für die vielen antworten.

ja bei mir steht genau das "Long binary-Daten" in access. Öffnen kann ich direkt in Access diese Daten nicht. Es erscheint dann eine Fehlermeldung. Ich kann es ja mal mit dem auslesen probieren.

Habe mich noch nie mit Derby beschäftigt. Wird das nicht zu langsam?
Da mir mein Chef im Nacken sitzt habe ich glaube ich leider auch nicht mehr die Zeit mich nun auch damit noch einzuarbeiten.


----------



## zeja (27. Februar 2007)

Nee dann lass das mal. Chefs haben das eh gerne mit Access weil man da einfach mal eben reingucken kann und verschicken kann etc 

Aber wenn das da nun so drinsteht sollte das auslesen dir auch die Datei wiederbringen.


----------



## sternchen84 (27. Februar 2007)

gut dann will ich das mal hoffen 

Vielen dank schonmal hat mir echt weitergeholfen!

Man lernt ja nie aus, erst recht nicht als Studentin


----------



## Thomas Darimont (27. Februar 2007)

Hallo,

schau mal hier:

```
/**
 * 
 */
package de.tutorials;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

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

/**
 * @author Tom
 * 
 */
public class MSAccessExample {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

        Connection con = DriverManager
                .getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:/temp/example.mdb");

        insertImageIntoDatabase(con, new File("c:/temp/winter.jpg"));
        BufferedImage image = readImageFromDB(1, con);
        con.close();        
        
        JFrame frame = new JFrame("MSAccessExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JLabel(new ImageIcon(image)));
        frame.pack();
        frame.setVisible(true);

        
    }

    private static BufferedImage readImageFromDB(int id, Connection con)
            throws Exception {
        PreparedStatement preparedStatement = con
                .prepareStatement("SELECT data FROM image WHERE id =?");
        preparedStatement.setInt(1, 1);
        ResultSet resultSet = preparedStatement.executeQuery();
        resultSet.next();
        InputStream data = resultSet.getBinaryStream("data");
        BufferedImage image = ImageIO.read(data);
        resultSet.close();
        preparedStatement.execute();
        preparedStatement.close();
        return image;
    }

    private static void insertImageIntoDatabase(Connection con, File file)
            throws Exception {
        PreparedStatement preparedStatement = con
                .prepareStatement("INSERT INTO image (data) VALUES(?)");
        preparedStatement.setBinaryStream(1, new FileInputStream(file),(int)file.length());
        preparedStatement.execute();
        preparedStatement.close();
    }
}
```

Gruß Tom


----------

