Title: Kapitel 9: Datenbankapplikationen
1Kapitel 9Datenbankapplikationen
2Datenbankapplikationen
DQ im Client DQ im Client DQ im
Client DB-Server-Protokoll DQ im Client DQ im
Client DB-Server-Protokoll DB-Server-Protokoll DQ
im DB-Server DB-Server-Protokoll
ODBC MS Visio
- MS Access
- Embedded SQL
- JDBC Application
- JDBC Applet
- Java Servlet
- Java Server Pages
- Cold Fusion
- PHP
3ODBC
Open Data base connectivity
ODBC-Datenquelle
Demo Systemsteuerung
4MS Visio
Demo Visio
5MS Access
- Stand-alone Datenbanksystem
- Frontend per ODBC für relationale Datenbank
- Schemadesign
- Beziehungen
- Queries
- Beziehungen
- Reports
- Formulare
Demo Access
6Zugriff per Programmiersprachen
- Embedded SQL
- JDBC Application
- JDBC Applet
- Java Servlet
- Java Server Pages
7Embedded SQL
8Hostvariable
- int persnr // Personalnummer
- char name20 // Name
- char rang3 // Rang
- int raum // Raum
- char gebdatum17 // Geburtsdatum
- short raum_ind // Raum-Indikator
- Innerhalb von SQL-Statements Doppelpunkt ()
voranstellen !
9Select
- 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)
10Cursor deklarieren
- EXEC SQL DECLARE C1 CURSOR FOR
- SELECT PersNr, Name, Rang, Raum, Gebdatum
- FROM Professoren
- WHERE Rang eingaberang
11Cursor füllen transferieren
- EXEC SQL OPEN C1
- EXEC SQL FETCH C1 INTO persnr, name,
rang, raum INDICATOR raum_ind,
gebdatum
12Inhalt 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, raumraum_ind, gebdatum -
- EXEC SQL CLOSE C1
13Beispiel.sqc, Teil 1
- void ErrorHandler (void)
- include ltstddef.hgt //
Standardheader - include ltstdio.hgt //
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 name20 //
Name - char rang3 //
Rang - int raum //
Raum - char gebdatum17 //
Geburtsdatum - short raum_ind //
Raum-Indikator - char eingaberang3 //
Eingabe vom User - EXEC SQL END DECLARE SECTION //
Deklarationen-Ende
14Beispiel.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
// Cursor vereinbaren - SELECT PersNr, Name, Rang, Raum, Gebdatum
// SQL-Statement - FROM Professoren
- WHERE Rang eingaberang
- EXEC SQL OPEN C1
// Cursor oeffnen - EXEC SQL FETCH C1 INTO persnr, name, rang,
// Versuche eine Zeile - raum INDICATOR raum_ind, gebdatum
// zu lesen
15Beispiel.sqc, Teil 3
- while (SQLCODE 0) //
SOLANGE erfolgreich -
- printf("d s s", persnr, name, rang) //
Tupel ausgeben - if(raum_ind -1) //
FALLS keine Raumnr - printf(" ???") //
Platzhalter drucken - else
- printf("4d", raum) //
SONST Raumnr - printf(" s\n", gebdatum) //
letztes Attribut - EXEC SQL FETCH C1 INTO persnr, name, rang,
// naechste Zeile - raumraum_ind, gebdatum
-
- EXEC SQL CLOSE C1 //
Cursor schliessen - EXEC SQL DISCONNECT ALL //
Verbindung beenden - return (0)
16Beispiel.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) -
17beispiel.exe
Demo beispiel.exe
18JDBC
- Java-Programm mit Klassen aus java.sql
- läuft im Clienten
- Application
- Applet
- Treiber laden und Verbindung herstellen
- SQL-Statement ausführen
- Ergebnis verarbeiten
19JDBC
- Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
- Connection con DriverManager.getConnection
("jdbcodbcdbs","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)
20JDBC Application
- Javac ShowJdbc.java
- java ShowJdbc
Demo Java ShowJdbc
21JDBC Applet
public class JdbcApplet extends Applet
BorderLayout new Border Layout() ...
ltHTMLgt ltHEADgt ltTITLEgtJDBC
Test-Appletlt/TITLEgt lt/HEADgt ltBODY
bgColorSilvergt ltCENTERgt ltH2gt
Demo-Applet für JDBC-Datenbankzugrifflt/H2gt
ltAPPLET codebase . code
JdbcApplet width 700
height 400gt lt/APPLETgt lt/CENTERgt
lt/BODYgt lt/HTMLgt
Demo JdbcApplet
22Java Servlet
- Java-Programm mit Klassen aus javax.servlet.
- läuft auf Server
- HTML-Form ausfüllen
- Argumente an Servlet schicken
- Servlet beantwortet Query mit JDBC
- Ergebnis wird als HTML zurückgeschickt
23VorVrz.java
- ...
- String query "select v.vorlnr, v.titel, v.sws "
- "from vorlesungen v, professoren p
" - "where v.gelesenvon p.persnr and
p.name '" - request.getParameter("professor_na
me") "'" - rs stmt.executeQuery(query)
- out.println("ltHTMLgt")
- out.println("ltHEADgtltTITLEgtJava Servletlt/TITLEgtlt/HE
ADgt") - out.println("ltBODYgt")
- out.println("ltH1gtVorlesungen von Prof. "
- request.getParameter("professor_name")
" lt/H1gt") - out.println("ltULgt")
- while (rs.next())
- out.println("ltLIgt"
- rs.getInt("VorlNr") " "
- rs.getString("Titel") " (mit "
- rs.getInt("SWS") " SWS)" "lt/LIgt")
- out.println("lt/ULgt")
- out.println("ltBODYgtlt/HTMLgt")
24Aufruf des Servlets
public class VrlVrz extends HttpServlet
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException,
IOException ...
ltHTMLgt ltHEADgt ltTITLEgtVorlesungsverzeichnis
mit Java Servletlt/TITLEgt lt/HEADgt ltBODYgt
ltFORM METHOD"GET" ACTION"VrlVrz"gt
Bitte geben Sie den Namen eines Professors
ein ltPgtltINPUT NAME"professor_name"
SIZE"40"gtltPgt ltINPUT TYPE"submit"
VALUE"Vorlesungen ermitteln"gt lt/FORMgt
lt/BODYgt lt/HTMLgt
Demo Servlet
25Java Server Pages
- Trennung von Form und Funktionalität
- Java-Klasse
- HTML-Seite mit Aufruf von Java-Methoden
- wird übersetzt zu Servlet
26VorlesungenBean.java (Teil 1)
- package dbs import java.sql.
- public class VorlesungenBean
- Connection con null
- String con_err null
- String profname null
- public VorlesungenBean()
- try
- Class.forName("com.microsoft.jdbc.sqlserver.
SQLServerDriver") - con DriverManager.getConnection(
- "jdbcmicrosoftsqlserver//arnold.informati
k.uni-osnabrueck.de1433", -
"erika","mustermann") -
- catch(Exception e) con_err
e.toString() -
- public void setProfname(String name)
profname name - public String getProfname() return
profname
27VorlesungenBean.java (Teil 2)
- public String generiereVorlListe()
- Statement stmt null
- ResultSet rs null
- if (connull) return ("Probleme mit der
Datenbank "con_err "ltBRgt") - StringBuffer result new StringBuffer()
- try
- stmt con.createStatement()
- String query
- "select v.vorlnr, v.titel, v.sws from
vorlesungen v, professoren p " - "where v.gelesenvon p.persnr and p.name
'" profname "'" - rs stmt.executeQuery(query)
- result.append("ltULgt")
- while (rs.next())
- result.append("ltLIgt"rs.getInt("VorlNr")"
"rs.getString("Titel") - " (mit " rs.getInt("SWS")
" SWS)" "lt/LIgt") - result.append("lt/ULgt")
-
- catch(SQLException e)
- result new StringBuffer("Bei der Abfrage
fuer " profname
28VorlesungenBean.java (Teil 3)
- public void finalize ()
- try if (con ! null ) con.close() catch
(SQLException ignorieren) -
29vorlesungen.jsp
- lt_at_ page import "dbs.VorlesungenBean" gt
- ltjspuseBean id"prg" class"dbs.VorlesungenBean"
scope"request"/gt - ltjspsetProperty name"prg" property""/gt
- lthtmlgt
- lt if (prg.getProfname() null) gt
- ltheadgtlttitlegtProfessoren-Namen
erfassenlt/titlegtlt/headgt - ltbody bgcolor"DDDDDD"gt
- ltFORM METHOD"GET"gt
- Bitte geben Sie den Namen eines
Professors einltPgt - ltINPUT TYPETEXT NAMEprofnamegtltPgt
- ltINPUT TYPESUBMIT VALUE"Vorlesungen
ermitteln!"gt - lt/FORMgt
- lt/bodygt
- lt else gt
- ltheadgtlttitlegtVorlesungen ausgebenlt/titlegtlt/hea
dgt - ltbody bgcolor"DDDDDD"gt
- Die Vorlesungen von lt prg.getProfname()
gt lauten ltPgt - lt prg.generiereVorlListe() gt
30Datenbankapplikationen
- MS Access
- Embedded SQL
- JDBC Application
- JDBC Applet
- Java Servlet
- Java Server Pages
- Cold Fusion
- PHP
printf("Professor s", profname) System.out.pr
intln("Prof." rs.getString("name") outputArea.
append( rs.getString("name") ) out.println("ltPgt"
rs.getString("name") ) ltPgtVorlesung lt
prg.getProfname() gt ltCFOUTPUT
QUERY"q1"gtprofnamelt/CFOUTPUTgt echo
"ltPgttupel0"
31Cold Fusion
32studliste.cfm
- ltCFQUERY NAME "Studentenliste"
- USERNAME "erika"
- PASSWORD "mustermann"
- DATASOURCE "dbs"
- DBTYPE "ODBC"gt
- SELECT matrnr, name from studenten
- lt/CFQUERYgt
- ltHTMLgt
- ltHEADgt
- ltTITLEgt Studentenliste lt/TITLEgt
- lt/HEADgt
- ltBODYgt
- ltH2gt Studentenliste (unformatiert)lt/H2gt
- ltCFOUTPUT QUERY"Studentenliste"gt
- name matrnr ltBRgt
- lt/CFOUTPUTgt
- lt/BODYgt
- lt/HTMLgt
Demo Coldfusion
33PHP
- Personal Home Page
- Server-basierte Scriptsprache
- Integriert in HTML-Seiten
- Grafik-Library GD
34frage.html
- ltHTMLgt
- ltHEADgt
- ltTITLEgtFragelt/TITLEgt
- lt/HEADgt
- ltBODYgt
- ltFORM METHOD"POST" ACTION"antwort.php"gt
- Bitte geben Sie Ihre SQL-Query ein
- ltPgtltINPUT NAME"frage" SIZE"70"gt
- ltPgt
- ltINPUT TYPE"submit" VALUE"Query
absetzen"gt - lt/FORMgt
- lt/BODYgt
- lt/HTMLgt
35antwort.php (Teil 1)
- ltHTMLgt
- ltHEADgt ltTITLEgtAntwort auf Datenbank
Querylt/TITLEgt - lt/HEADgt
-
- ltBODY BGCOLOR"DDDDDD"gt
-
- lt?php
- conmssql_connect("arnold", "erika",
"mustermann") - mssql_select_db("uni",con)
- rs mssql_query(frage, con)
- s mssql_num_fields(rs)
36antwort.php (Teil 2)
- echo "Antwort ermittelt durch PHP-ScriptltPgt"
- echo "lttable border cellpadding3gt\n"
- echo "lttrgt"
- for (i0 ilts i)
- name mssql_fetch_field(rs,i)
- echo "ltthgtname-gtnamelt/thgt"
- echo "lt/trgt"
- while (tupel mssql_fetch_array(rs))
- echo "lttrgt"
- for (i0 ilts i)
- echo "lttdgttupelilt/tdgt"
- echo "lt/trgt"
-
- echo "lt/tablegt\n"
- mssql_free_result(rs)
- mssql_close(con)
- ?gt
Demo PHP
37balken.php
- lt?php
- breite zahl10
- hoehe 30
- bild imagecreate(breite, hoehe)
- farbe_balken imagecolorallocate(bild,
0, 0, 255) - farbe_schrift imagecolorallocate(bild,
255, 255, 255) - ImageString(bild,3,breite-16,8,zahl,farbe_
schrift) - header("Content-Type image/png")
- imagepng(bild)
- ?gt
38semester.php (Ausschnitt)
- frage "select name, semester from studenten
order by name" - rs mssql_query(frage, con)
- echo "lttable border1gt\n"
- echo "ltTRgtltTHgtStudentlt/THgtltTHgtStudiendauerlt/THgtlt
/TRgt" - while (tupel mssql_fetch_array(rs))
- echo "ltTRgt"
- echo "ltTDgttupel0lt/TDgt"
- echo "ltTDgtltIMG SRCbalken.php?zahltupel1gtlt
/TDgt" - echo "lt/TRgt\n"
-
- echo "lt/tablegt\n"
Demo semester.php
39torte.php
- lt?php
- include ("../jpgraph/src/jpgraph.php")
- include ("../jpgraph/src/jpgraph_pie.php")
- graph new PieGraph(600,400,"auto")
- graph-gtSetShadow()
- graph-gttitle-gtSet("Lehrbelastung der
Professoren") - graph-gttitle-gtSetFont(FF_FONT1,FS_BOLD)
- p1 new PiePlot(daten)
- p1-gtSetLegends(namen)
- p1-gtSetCenter(0.4)
- graph-gtAdd(p1)
- graph-gtStroke()
- ?gt
40lehre.php (Ausschnitt)
- frage "select name, sum(sws)
- from vorlesungen, professoren
- where persnrgelesenvon group by name"
- rs mssql_query(frage, con)
- i0
- while (tupel mssql_fetch_array(rs))
- parameter ."nameni".tupel0.""
- parameter ."dateni".tupel1.""
- i
-
- echo "ltIMG SRCtorte.php?parametergt"
Demo lehre.php