Datenbankapplikationen 9.1 9.2 9.3 9.4 9.5 9.6 MS Visio MS Access Embedded SQL JDBC Cold Fusion PHP 1 voraussetzen PK,FK2 PK,FK1 MS Visio Studenten PK hoeren MatrNr PK,FK1 PK,FK2 Name Semester GebDatum pruefen PK,FK2 PK,FK3 MatrNr VorlNr FK1 PersNr Note MatrNr VorlNr Vorgaenger Nachfolger Vorlesungen PK VorlNr FK1 Titel SWS gelesenVon Professoren PK PersNr Name Rang Raum Gebdatum U1 Assistenten PK FK1 PersNr Name Fachgebiet Boss GebDatum 2 MS Access Frontend per ODBC Queries interaktiv Queries in SQL-Form Beziehungen Reports Formulare 3 Embedded SQL Host-Programm: hallo.pc SQL Include Files Pre-Compiler Quell-Programm: hallo.c C-Compiler Objekt-Programm: C Include Files hallo.o C-Linker Ausführbares Programm: Runtime Library hallo.exe 4 Hostvariable int char char int char persnr; name[20]; rang[3]; raum; gebdatum[17]; // // // // // Personalnummer Name Rang Raum Geburtsdatum short raum_ind; // Raum-Indikator Innerhalb von SQL-Statements: Doppelpunkt (:) voranstellen ! 5 Select EXEC SQL SELECT persnr, raum INTO :persnr, :raum INDICATOR :raum_ind FROM Professoren WHERE PersNr = 2125; if (raum_ind == -1) printf("Personalnummer %d ohne Raumangabe \n", persnr); 6 Cursor deklarieren EXEC SQL DECLARE C1 CURSOR FOR SELECT PersNr, Name, Rang, Raum, Gebdatum FROM Professoren WHERE Rang = :eingaberang; 7 Cursor füllen + transferieren EXEC SQL OPEN C1; EXEC SQL FETCH C1 INTO :persnr, :name, :rang, :raum INDICATOR :raum_ind, :gebdatum; 8 Inhalt abarbeiten while (SQLCODE == 0) printf("%d %s %s", persnr, name, rang); if(raum_ind == -1) printf(" ???"); else printf("%4d", raum); printf(" %s\n", gebdatum); EXEC SQL FETCH C1 INTO :persnr, :name, :rang, :raum:raum_ind, :gebdatum; } EXEC SQL CLOSE C1; 9 Beispiel.sqc, Teil 1 void ErrorHandler (void); #include <stddef.h> // Standardheader #include <stdio.h> // Standardheader int main ( int argc, char** argv, char** envp) { EXEC SQL BEGIN DECLARE SECTION; // Deklarationen-Start char serverDatenbank[] = "arnold.uni"; // Server + DB char loginPasswort[] = "erika.mustermann"; // User + Passwort int persnr; // Personalnummer char name[20]; // Name char rang[3]; // Rang int raum; // Raum char gebdatum[17]; // Geburtsdatum short raum_ind; // Raum-Indikator char eingaberang[3]; // Eingabe vom User EXEC SQL END DECLARE SECTION; // Deklarationen-Ende 10 Beispiel.sqc, Teil 2 EXEC SQL WHENEVER SQLERROR CALL ErrorHandler(); // Fehlermarke EXEC SQL CONNECT TO :serverDatenbank // Verbindung aufbauen USER :loginPasswort; printf("Bitte Rang eingeben: "); // gewuenschten Rang scanf("%s", eingaberang); // vom user holen printf("Mit Rang %s gespeichert:\n", eingaberang); EXEC SQL DECLARE C1 CURSOR FOR SELECT PersNr, Name, Rang, Raum, Gebdatum FROM Professoren WHERE Rang = :eingaberang; // Cursor vereinbaren // SQL-Statement EXEC SQL OPEN C1; EXEC SQL FETCH C1 INTO :persnr, :name, :rang, :raum INDICATOR :raum_ind, :gebdatum; // Cursor oeffnen // Versuche eine Zeile // zu lesen 11 Beispiel.sqc, Teil 3 while (SQLCODE == 0) { printf("%d %s %s", persnr, name, rang); if(raum_ind == -1) printf(" ???"); else printf("%4d", raum); printf(" %s\n", gebdatum); // SOLANGE erfolgreich // Tupel ausgeben // FALLS keine Raumnr // Platzhalter drucken // SONST Raumnr // letztes Attribut EXEC SQL FETCH C1 INTO :persnr, :name, :rang, // naechste Zeile :raum:raum_ind, :gebdatum; } EXEC SQL CLOSE C1; EXEC SQL DISCONNECT ALL; return (0); } // Cursor schliessen // Verbindung beenden 12 Beispiel.sqc, Fehlerroutine void ErrorHandler (void) { printf("In Error Handler:\n"); printf(" SQL Code = %li\n", SQLCODE); printf(" SQL Server Message %li: '%Fs'\n", SQLERRD1, SQLERRMC); } 13 JDBC Java-Programm mit Klassen aus java.sql Erzeuge Java-Code für • Application • Applet • • • Treiber laden und Verbindung herstellen SQL-Statement ausführen Ergebnis verarbeiten 14 JDBC Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); Connection con = DriverManager.getConnection (“jdbc:odbc:dbs2001“,“erika“,“mustermann“); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery (“select * persnr, name from professoren“); while (rs.next()) { int x = rs.getInt(“persnr“); String s = rs.getString(“name“); System.out.println(“Professor “+s+“ hat Nr. “+x); } 15 ColdFusion 16 PHP • • • Personal Home Page Server-basierte Scriptsprache Integriert in HTML-Seiten 17 frage.html <HTML> <HEAD> <TITLE>Frage</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="antwort.php"> Bitte geben Sie Ihre SQL-Query ein: <P><INPUT NAME="frage" SIZE="70"> <P> <INPUT TYPE="submit" VALUE="Query absetzen"> </FORM> </BODY> </HTML> 18 <HTML> antwort.html (Teil 1) <HEAD> <TITLE>Antwort</TITLE> </HEAD> <BODY> <H2>Antwort ermittelt durch PHP-Script:</H2> <?php $con = mssql_connect("MSSQL","erika","mustermann"); mssql_select_db("uni",$con); $rs = mssql_query($frage, $con); $z = mssql_num_rows($rs); $s = mssql_num_fields($rs); 19 echo "<table border>\n"; echo "<tr>"; for ($i=0 ; $i<$s ; ++$i) { $name = mssql_fetch_field($rs,$i); echo "<th>$name->name</th>"; } echo "</tr>"; while ($tupel = mssql_fetch_array($rs)) { echo "<tr>"; for ($i=0 ; $i<$s ; ++$i) { echo "<td>$tupel[$i]</td>"; } echo "</tr>"; } echo "</table>\n"; mssql_free_result($rs); mssql_close($con); antwort.html (Teil 2) ?> </BODY> </HTML> 20