volksfür

Werbung
Grosse Objekte (Bilder)
11 Grosse Objekte (Bilder)
Als Literatur können normale Java-Bücher dienen, z.B. [3] und [7].
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: Übersichtliche Darstellung, Zugriffsschutz, Transaktionsschutz, einfache Sicherung,
Übersichtlichkeit beim Transport.
Das Vorgehen ist wie folgt:
1) Vorbereitung in der Datenbank
2) Datasource anlegen
3) Bild in die Datenbank eintragen
4) Bild aus der Datenbank lesen
5) Weitere Möglichkeiten
6) Verhalten von Access
1) Vorbereitung in der Datenbank
Tabelle in SQL Server-Datenbank anlegen mit Spalten name, groesse, bild
create table Bilder (bname char(25), bsize int, bcontent image);
select * from Bilder
2) Datasource anlegen
3) Bild in die Datenbank eintragen
Programm: Datei -> Datenbank
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.sql.*;
import java.util.*;
public class Schreiben extends Frame
{ Panel ein = new Panel(new GridLayout(0,2));
Label lab1 = new Label("Dateiname");
TextField dnam = new TextField();
Button go = new Button("los");
FileInputStream fis;
String dateiname;
public Schreiben()
{
add("Center", ein);
ein.add(lab1);
ein.add(dnam);
ein.add(go);
setSize(400,250);
setVisible(true);
TFH Berlin/Steyer
Grosse Objekte (Bilder)
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0); }} );
go.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
datenbank();}});
}
private void datenbank()
{
try
{
dateiname = dnam.getText();
File content = new File (dnam.getText());
long len1 = content.length();
int len2 = (int) len1;
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();};
}
public static void main(String[] args)
{
new Schreiben();
}
}
Ein Web-Browser kann das Datei-Bild auch anzeigen.
4) Bild aus der Datenbank lesen
Programm: Bild aus Datenbank lesen, in neue Datei schreiben und anzeigen, kann auch mit Paint angezeigt
werden
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.io.*;
import javax.imageio.*;
TFH Berlin/Steyer
Grosse Objekte (Bilder)
public class Lesen extends Frame
{
Panel aus = new Panel(new GridLayout(0,2));
Label lab1 = new Label("Name:");
TextField dat = new TextField();
Button zeigen = new Button("Bild anzeigen");
public Lesen()
{
add("Center",aus);
aus.add(lab1);
aus.add(dat);
aus.add(zeigen);
setSize(300, 300);
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
zeigen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
datenbank();
}
});
}
private void datenbank()
{
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);
rs.next();
String bname = rs.getString("bname");
int len2 = rs.getInt("bsize");
byte[] b = rs.getBytes("bcontent");
FileOutputStream 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 = aus.getGraphics();
gpnl.drawImage (img,100,0,300,300,null);
content.delete();
};
public static void main(String[] args)
{
new Lesen();
}
}
5) Weitere Möglichkeiten
+ 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 ?
- 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:
ausloggen
als luser1/xyz:
ausloggen
als luser2/uvw:
ausloggen
als Windows User:
TFH Berlin/Steyer
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
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
Grosse Objekte (Bilder)
6) Verhalten von 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
Herunterladen