12 Grosse Objekte (Bilder) Datenbanken können auch grössere Datenobjekte speichern und zurückgeben, z.B. Bilder, Dokumente, Filme, Töne. Der Tabellenrahmen bleibt erhalten. Deshalb können Zusatzinformationen zu den Datenobjekten in anderen Spalten aufgenommen werden. Durch dieses Konzept wird datenbankspezifischer Nutzen (im Gegensatz zur Dateibenutzung) möglich: Zugriffsschutz, Transaktionsschutz, einfache Sicherung, Übersichtlichkeit beim Transport. Beispielhafter Ablauf: Tabelle in SQL Server-Datenbank anlegen mit Spalten name, groesse, bild JPG-Bild in die Datenbank eintragen Datasource anlegen Internet-Explorer kann das Datei-Bild auch anzeigen. 1. Programm: Mit Java-Programm Bild in Datenbank schreiben -> Werte sind in der Tabelle 2. Programm: Mit Java-Programm Bild aus Datenbank lesen, in neue Datei schreiben und anzeigen, kann auch mit Paint angezeigt werden Vorbereitung in der Datenbank: create table Bilder (bname char(25), bsize int, bcontent image); select * from Bilder 1.Programm: Datei -> Datenbank import java.io.*; import java.sql.*; import java.util.*; public class SchreibeBildInfoinDatenbankSQLServer { public static void main(String[] args) { Scanner sc = new Scanner (System.in); System.out.print("Bitte Dateiname eingeben: "); String dateiname = sc.nextLine(); File content = new File (dateiname); long len1 = content.length(); int len2 = (int) len1; try { FileInputStream fis = new FileInputStream(content); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:sqlserverdb","",""); PreparedStatement ps = c.prepareStatement ("INSERT INTO Bilder VALUES (?,?,?)"); ps.setString (1,dateiname); ps.setInt (2, len2); ps.setBinaryStream (3, fis, len2); ps.executeUpdate(); } catch (Exception ex) {ex.printStackTrace();}; } } TFH Berlin/Steyer 2.Programm: Datenbank -> anzeigen import java.awt.*; import java.awt.event.*; import java.sql.*; import java.io.*; import javax.imageio.*; public class LiesBildInfoausDatenbankSQLServer extends Frame { Panel pnl = new Panel(new GridLayout(0,2)); Label lab1 = new Label("Name:"); TextField dat = new TextField(); Label lab2 = new Label("Foto:"); public static void main(String[] args) { LiesBildInfoausDatenbankSQLServer f = new LiesBildInfoausDatenbankSQLServer(); f.setVisible(true); } public LiesBildInfoausDatenbankSQLServer() { super("Bilder aus der Datenbank"); setBounds(300, 200, 400, 300); pnl.add(lab1); pnl.add(dat); pnl.add(lab2); pnl.setPreferredSize(new Dimension(300, 300)); pnl.setBackground(Color.CYAN); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { System.exit(0); } }); pnl.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { String dateiname = dat.getText(); File content = new File (dateiname); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:sqlserverdb","",""); Statement s = c.createStatement (); String sql = "SELECT * FROM Bilder WHERE bname = '" + dateiname + "'"; ResultSet rs = s.executeQuery(sql); TFH Berlin/Steyer rs.next(); String bname = rs.getString("bname"); int len2 = rs.getInt("bsize"); byte[] b = rs.getBytes("bcontent"); FileOutputStream fos; fos = new FileOutputStream(content); fos.write(b,0,len2); } catch (Exception e1) {e1.printStackTrace();}; Image img = null; try { img = ImageIO.read (content); } catch (IOException e2) {} Graphics gpnl = pnl.getGraphics(); gpnl.drawImage (img,100,0,300,300,null); content.delete(); } }); add(pnl, BorderLayout.EAST); } } weiteres Vorgehen: + Bildanwendung, z.B. Personaltabelle (Name, Bild) mit Digitalcamera + jpg-Format, bmp-Format testen + Bilddateiname und -länge in die Datenbank schreiben, zum Lesen benutzen - Datenbankspezifischen Nutzen (i. Gegs. zur Dateibenutzung) verdeutlichen: + Zugriffsschutz - Transaktionsschutz - Übersicht (z.B. beim Transport) - Leistung ? - TFH Berlin/Steyer Docs auch (z.B. Lebenslauf) 2 Tabellen benutzen: eine mit Referenzen, die andere mit den Bildern Andere Lese-/Schreibmethoden (getBlob, getBinaryStream) und Datentypen Access: nur interaktiv oder anderer Datentyp? SQL Server: bcp-Dienstprogramm benutzen Zugriffsprivilegien einrichten als Windows User: create login luser1 with password ’xyz’ create user user1 for login luser1 grant select on bilder (bname) to user1 create login luser2 with password ’uvw’ create user user2 for login luser2 grant select on bilder (bname,bsize,bcontent) to user2 ausloggen als luser1/xyz: ausloggen als luser2/uvw: ausloggen als Windows User: select bname from bilder -> funktioniert select bsize from bilder -> bringt einen Fehler select * from bilder -> bringt zwei Fehler mit Namen der nichtberechtigten Spalten alles geht drop user user1 drop login luser1 übrigens Access Die Bildtabelle wird wie im SQLServer, mit dem Datentyp OLE-Objekt für bcontent, angelegt. Die Bilder werden in die Tabelle interaktiv eingefüllt. Das Anzeigen erfolgt im Formular, aber nur für den bmp-Typ Jpg-Bilder müssen erst in bmp-Bilder konvertiert werden (mit paint). Sie sind dann viel grösser. Auch die mdb-Datenbank schwillt (dynamisch) stark an. Sie wird beim Löschen der Bilder dynamisch aber nicht verkleinert. TFH Berlin/Steyer