SQL ohne Datenrückgabe 4 SQL ohne Datenrückgabe (insert, update, delete u.a.) 4.1 INSERT mit EXECUTE Die meisten anderen SQL-Befehle liefern keine Ergebnismenge zurück. Sie werden nur zum Datenbanksystem geschickt und dort ausgeführt, z.B. insert, update, delete. Aber auch create table, drop table, create view, drop view u.ä. Sie werden viel seltener benutzt (in 20% der Fälle?). import java.sql.*; public class insert1 { public static void main(String[] args) throws Exception { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:accessdb","",""); String sql = "INSERT INTO person VALUES ('x', 'x')"; System.out.println(sql); Statement s = c.createStatement(); s.execute(sql); c.close(); } } TFH Berlin/Steyer SQL ohne Datenrückgabe 4.2 PREPARE Beim Erfassen von Daten müssen INSERT-Befehle ausgeführt werden, die sich oft nur in den Werten unterscheiden. Ein solcher INSERT-Befehl wird vom Datenbanksystem nur das erste Mal geparst und danach lediglich mit wechselnden Werten gefüllt. Das geschieht mit dem Befehlstyp PreparedStatement. Dieses wird vom Programmierer mit dem konstanten Teil gefüllt, mit Fragezeichen an den Stellen der Werte. Dieses PreparedStatement wird an das Datenbanksystem geschickt und ein einziges Mal geparst. Später in der Ausführungsschleife werden nur noch Werte auf die Plätze der Fragezeichen gesetzt. import java.awt.*; import java.awt.event.*; import java.sql.*; import java.util.*; public class insert2 extends Frame { // GUI-Variable Label status = new Label("bereit ...", Label.LEFT); Panel ein = new Panel(new GridLayout(0,2)); TextField vor = new TextField(); TextField nac = new TextField(); Button bein; // JDBC-Variable String drv = "sun.jdbc.odbc.JdbcOdbcDriver"; String url = "jdbc:odbc:accessdb"; int code; Connection c; PreparedStatement ps; String ins = "INSERT INTO person VALUES (?, ?)"; public insert2() { // Fenster add("Center", ein); ein.add(new Label("Vorname")); ein.add(vor); ein.add(new Label("Nachname")); ein.add(nac); ein.add(bein = new Button("Einfügen")); add("South", status); setSize(400,250); setVisible(true); try { Class.forName(drv); c = DriverManager.getConnection(url, "", ""); ps = c.prepareStatement(ins); } catch (Exception ex) {ex.printStackTrace();} TFH Berlin/Steyer SQL ohne Datenrückgabe addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); }} ); bein.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { rein(ins);}}); } private void rein(String i) { try { ps.setString(1,vor.getText()); ps.setString(2,nac.getText()); // status.setText("Query: " + q); ps.execute(); } catch (Exception ex) {ex.printStackTrace();} } public static void main(String[] args) { new insert2(); } } 1. Benutzung: SQL-Befehl vollständig ausführen PARSE-Teil EXECUTE-Teil Daten Weitere Benutzungen: in SQL-Befehl nur noch Werte einsetzen, ausführen, nicht parsen PARSE-Teil EXECUTE-Teil Daten Diese Technik kann auch dazu benutzt werden, grosse Werte, z.B.Bilder, in Datenbankfelder einzutragen TFH Berlin/Steyer