diff options
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100267.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100267.html | 633 |
1 files changed, 633 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100267.html b/Master/Reference Architectures and Patterns/hjp5/html/k100267.html new file mode 100644 index 0000000..ebab778 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100267.html @@ -0,0 +1,633 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100265.html;106,k100266.html;107,k100268.html;108,k100271.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100265.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100266.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100268.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100271.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 42 - Datenbankzugriffe mit JDBC
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id042002"></a>
+<h2>42.2 Grundlagen von JDBC </h2>
+<hr>
+<ul>
+<li><a href="k100267.html#sectlevel2id042002">42.2 Grundlagen von JDBC</a>
+<ul>
+<li><a href="k100267.html#sectlevel3id042002001">42.2.1 Öffnen einer Verbindung</a>
+<li><a href="k100267.html#sectlevel3id042002002">42.2.2 Erzeugen von Anweisungsobjekten</a>
+<li><a href="k100267.html#sectlevel3id042002003">42.2.3 Datenbankabfragen</a>
+<li><a href="k100267.html#sectlevel3id042002004">42.2.4 Datenbankänderungen</a>
+<li><a href="k100267.html#sectlevel3id042002005">42.2.5 Die Klasse SQLException</a>
+<li><a href="k100267.html#sectlevel3id042002006">42.2.6 Die Klasse SQLWarning</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id042002001"></a>
+<h3>42.2.1 Öffnen einer Verbindung </h3>
+
+<p>
+Bevor mit JDBC auf eine Datenbank zugegriffen werden kann, muss zunächst
+eine Verbindung zu ihr hergestellt werden. Dazu muss der Datenbanktreiber
+geladen und initialisiert und mit Hilfe des Treibermanagers ein Verbindungsobjekt
+beschafft werden. Es bleibt während der gesamten Verbindung bestehen
+und dient als Lieferant für spezielle Objekte zur Abfrage und
+Veränderung der Datenbank. Alle Klassen zum Zugriff auf die JDBC-Schnittstelle
+liegen im Paket <a name="ixa103052"><a href="index_j.html#ixb100193"><font color=#000080><tt>java.sql</tt></font></a></a>,
+das am Anfang des Programms importiert werden sollte:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+import java.sql.*;
+</pre>
+</font>
+</td>
+</tr>
+</table>
+
+<p>
+Jeder JDBC-Treiber hat einen statischen Initialisierer, der beim Laden
+der Klasse aufgerufen wird. Seine Aufgabe besteht darin, sich beim
+<a name="ixa103053"><i>Treibermanager</i></a> zu registrieren, um
+bei späteren Verbindungsanfragen von diesem angesprochen werden
+zu können. Das Laden der Treiberklasse wird üblicherweise
+durch Aufruf der Methode <a href="index_f.html#ixb102240"><font color=#000080><tt>forName</tt></font></a>
+der Klasse <a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a>
+erledigt (siehe <a href="k100273.html#dieklasseclass">Abschnitt 43.2.2</a>).
+Um einen Treiber zu laden, muss man also seinen vollständigen
+Klassennamen kennen:
+<font color="#000077">
+<pre>
+Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
+</pre>
+</font>
+
+<p>
+<a name="ixa103054"><a href="index_s.html#ixb102241"><font color=#000080><tt>sun.jdbc.odbc.JdbcOdbcDriver</tt></font></a></a>
+ist der Name der JDBC-ODBC-Bridge, mit der die oben erwähnten
+Typ-1-Treiber realisiert werden. Die Namen alternativer Treiber sind
+der Dokumentation des jeweiligen Herstellers zu entnehmen.
+
+<p>
+Nachdem der Treiber geladen wurde, kann er dazu verwendet werden,
+eine Verbindung zu einer Datenbank aufzubauen. Dazu wird an die statische
+Methode <a name="ixa103055"><a href="index_g.html#ixb102242"><font color=#000080><tt>getConnection</tt></font></a></a>
+der Klasse <a name="ixa103056"><a href="index_d.html#ixb102243"><font color=#000080><tt>DriverManager</tt></font></a></a>
+ein String und eventuell weitere Parameter übergeben, um den
+Treibertyp, die Datenbank und nötigenfalls weitere Informationen
+festzulegen. <a href="index_g.html#ixb102242"><font color=#000080><tt>getConnection</tt></font></a>
+gibt es in drei Ausprägungen:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+static Connection getConnection(
+ String url
+)
+
+static Connection getConnection(
+ String url,
+ String user,
+ String password
+)
+
+static Connection getConnection(
+ String url,
+ Properties info
+)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/sql/DriverManager.html" onClick="this.href=getApiDoc('java.sql.DriverManager')"><font color="#660066" size=-1>java.sql.DriverManager</font></a></td>
+</tr>
+</table>
+
+<p>
+Die erste Variante erwartet lediglich einen Connection-String als
+Argument, der in Form eines URL (Uniform Ressource Locator, siehe
+<a href="k100255.html#dieklasseurl">Abschnitt 40.1.1</a>) übergeben
+wird. Der Connection-String besteht aus mehreren Teilen, die durch
+Doppelpunkte voneinander getrennt sind. Der erste Teil ist immer »jdbc«
+und zeigt an, dass es sich um einen JDBC-URL handelt. Der zweite Teil
+wird als <i>Sub-Protokoll</i> bezeichnet und gibt an, welcher Treiber
+verwendet werden soll. Die übrigen Teile sind treiberspezifisch.
+Connection-Strings für die JDBC-ODBC-Bridge beginnen immer mit
+»jdbc:odbc«, gefolgt von einem weiteren Doppelpunkt, nach
+dem der Name der ODBC-Datenquelle angegeben wird:
+<font color="#000077">
+<pre>
+con = DriverManager.getConnection("jdbc:odbc:DirDB");
+</pre>
+</font>
+
+<p>
+Die zweite Variante von <a href="index_g.html#ixb102242"><font color=#000080><tt>getConnection</tt></font></a>
+erlaubt es, zusätzlich den Benutzernamen und das Passwort an
+die Datenbank zu übergeben. Das ist bei vielen Datenbanken erforderlich,
+um eine Verbindung aufbauen zu können. Bei der dritten Variante
+können zusätzlich mit Hilfe eines <a href="index_p.html#ixb100703"><font color=#000080><tt>Properties</tt></font></a>-Objekts
+weitere, treiberspezifische Informationen übergeben werden. Welche
+Variante zu verwenden ist, muss der jeweiligen Treiberdokumentation
+entnommen werden.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Falls die Datenbank nicht geöffnet werden konnte, löst <a href="index_g.html#ixb102242"><font color=#000080><tt>getConnection</tt></font></a>
+eine Ausnahme des Typs <a name="ixa103057"><a href="index_s.html#ixb102244"><font color=#000080><tt>SQLException</tt></font></a></a>
+aus. Diese Ausnahme wird auch von fast allen anderen Methoden und
+Klassen verwendet, um einen Fehler beim Zugriff auf die Datenbank
+anzuzeigen.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Wenn die Verbindung erfolgreich aufgebaut werden konnte, liefert <a href="index_g.html#ixb102242"><font color=#000080><tt>getConnection</tt></font></a>
+ein Objekt, das das Interface <a name="ixa103058"><a href="index_c.html#ixb102245"><font color=#000080><tt>Connection</tt></font></a></a>
+implementiert. Dieses Verbindungsobjekt repräsentiert die aktuelle
+Datenbanksitzung und dient dazu, Anweisungsobjekte zu erzeugen und
+globale Einstellungen an der Datenbank zu verändern. Das <a href="index_c.html#ixb102245"><font color=#000080><tt>Connection</tt></font></a>-Objekt
+kann durch Aufruf von <a name="ixa103059"><a href="index_c.html#ixb100957"><font color=#000080><tt>close</tt></font></a></a>
+explizit geschlossen werden. Die Verbindung wird automatisch geschlossen,
+wenn die <a href="index_c.html#ixb102245"><font color=#000080><tt>Connection</tt></font></a>-Variable
+vom Garbage Collector zerstört wird.
+
+<!-- Section -->
+
+<a name="sectlevel3id042002002"></a>
+<h3>42.2.2 Erzeugen von Anweisungsobjekten </h3>
+
+<p>
+Alle Abfragen und Änderungen der Datenbank erfolgen mit Hilfe
+von <a name="ixa103060"><i>Anweisungsobjekten</i></a>. Das sind Objekte,
+die das Interface <a name="ixa103061"><a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a></a>
+oder eines seiner Subinterfaces implementieren und von speziellen
+Methoden des <a href="index_c.html#ixb102245"><font color=#000080><tt>Connection</tt></font></a>-Objekts
+erzeugt werden können:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+Statement createStatement()
+
+PreparedStatement prepareStatement(String sql)
+
+CallableStatement prepareCall(String sql)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/sql/Connection.html" onClick="this.href=getApiDoc('java.sql.Connection')"><font color="#660066" size=-1>java.sql.Connection</font></a></td>
+</tr>
+</table>
+
+<p>
+Die einfachste Form ist dabei das von <a name="ixa103062"><a href="index_c.html#ixb102248"><font color=#000080><tt>createStatement</tt></font></a></a>
+erzeugte <a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a>-Objekt.
+Es kann dazu verwendet werden, unparametrisierte Abfragen und Änderungen
+der Datenbank zu erzeugen. Seine beiden wichtigsten Methoden sind
+<a name="ixa103063"><a href="index_e.html#ixb102249"><font color=#000080><tt>executeQuery</tt></font></a></a>
+und <a name="ixa103064"><a href="index_e.html#ixb102250"><font color=#000080><tt>executeUpdate</tt></font></a></a>.
+Sie erwarten einen SQL-String als Argument und reichen diesen an die
+Datenbank weiter. Zurückgegeben wird entweder ein einfacher numerischer
+Ergebniswert, der den Erfolg der Anweisung anzeigt, oder eine Menge
+von Datenbanksätzen, die das Ergebnis der Abfrage repräsentieren.
+Auf die beiden übrigen Anweisungstypen werden wir später
+zurückkommen.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+<a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a>-Objekte
+sind bei manchen Treibern <i>kostspielige</i> Ressourcen, deren Erzeugen
+viel Speicher oder Rechenzeit kostet. Das Erzeugen einer großen
+Anzahl von <a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a>-Objekten
+(beispielsweise beim Durchlaufen einer Schleife) sollte in diesem
+Fall vermieden werden. Viele JDBC-Programme legen daher nach dem Öffnen
+der Verbindung eine Reihe von vordefinierten <a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a>-Objekten
+an und verwenden diese immer wieder. Obwohl das im Prinzip problemlos
+möglich ist, kann es in der Praxis leicht dazu führen, dass
+ein <a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a>-Objekt,
+das noch in Gebrauch ist (beispielsweise, weil seine Ergebnismenge
+noch nicht vollständig abgefragt ist), erneut verwendet wird.
+Das Verhalten des Programms ist dann natürlich undefiniert. Wir
+werden später in <a href="k100269.html#jdbcobjekte">Abschnitt 42.4.5</a>
+eine Lösung für dieses Problem kennenlernen.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
+<tr>
+<td><font color="#FFFFFF"> Warnung </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel3id042002003"></a>
+<h3>42.2.3 Datenbankabfragen </h3>
+
+<p>
+Hat man ein <a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a>-Objekt
+beschafft, kann dessen Methode <a name="ixa103065"><a href="index_e.html#ixb102249"><font color=#000080><tt>executeQuery</tt></font></a></a>
+verwendet werden, um Daten aus der Datenbank zu lesen:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public ResultSet executeQuery(String sql)
+ throws SQLException
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/sql/Statement.html" onClick="this.href=getApiDoc('java.sql.Statement')"><font color="#660066" size=-1>java.sql.Statement</font></a></td>
+</tr>
+</table>
+
+<p>
+Die Methode erwartet einen SQL-String in Form einer gültigen
+<a name="ixa103066"><i>SELECT-Anweisung</i></a> und gibt ein Objekt
+vom Typ <a name="ixa103067"><a href="index_r.html#ixb102252"><font color=#000080><tt>ResultSet</tt></font></a></a>
+zurück, das die Ergebnismenge repräsentiert. Als Argument
+dürfen beliebige SELECT-Anweisungen übergeben werden, sofern
+sie für die zugrunde liegende Datenbank gültig sind. Die
+folgende SQL-Anweisung selektiert beispielsweise alle Sätze aus
+der Tabelle <font color="#000077"><tt>dir</tt></font>, deren Feld
+<font color="#000077"><tt>did</tt></font> den Wert 7 hat:
+<font color="#000077">
+<pre>
+SELECT * FROM dir WHERE did = 7
+</pre>
+</font>
+
+<p>
+Das zurückgegebene Objekt vom Typ <a href="index_r.html#ixb102252"><font color=#000080><tt>ResultSet</tt></font></a>
+besitzt eine Methode <a name="ixa103068"><a href="index_n.html#ixb100509"><font color=#000080><tt>next</tt></font></a></a>,
+mit der die Ergebnismenge schrittweise durchlaufen werden kann:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+boolean next()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/sql/ResultSet.html" onClick="this.href=getApiDoc('java.sql.ResultSet')"><font color="#660066" size=-1>java.sql.ResultSet</font></a></td>
+</tr>
+</table>
+
+<p>
+Nach dem Aufruf von <a href="index_e.html#ixb102249"><font color=#000080><tt>executeQuery</tt></font></a>
+steht der Satzzeiger zunächst <i>vor</i> dem ersten Element,
+jeder Aufruf von <a href="index_n.html#ixb100509"><font color=#000080><tt>next</tt></font></a>
+positioniert ihn auf das nächste Element. Der Rückgabewert
+gibt an, ob die Operation erfolgreich war. Ist er <a href="index_f.html#ixb100234"><font color=#000080><tt>false</tt></font></a>,
+gibt es keine weiteren Elemente in der Ergebnismenge. Ist er dagegen
+<a href="index_t.html#ixb100233"><font color=#000080><tt>true</tt></font></a>,
+konnte das nächste Element erfolgreich ausgewählt werden,
+und mit Hilfe verschiedener <font color="#000077"><tt>get...</tt></font>-Methoden
+kann nun auf die einzelnen Spalten zugegriffen werden. Jede dieser
+Methoden steht in zwei unterschiedlichen Varianten zur Verfügung:
+<ul>
+<li>Wird ein numerischer Wert <i>n</i> als Argument übergeben,
+so wird dieser als Spaltenindex interpretiert und der Wert der <i>n</i>-ten
+Spalte zurückgegeben. Wichtig: Anders als bei Arrays hat die
+erste Spalte den Index 1.
+<li>Wird ein <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+als Argument übergeben, so wird er als Name interpretiert und
+der Wert der Spalte mit diesem Namen zurückgegeben. Diese Variante
+soll zwar marginal langsamer als die erste sein, ist aber weniger
+fehlerträchtig. Da der Aufruf nicht mehr von der Spaltenreihenfolge
+der Abfrage abhängt, ist ihr normalerweise der Vorzug zu geben
+(das klappt leider nicht immer, wie die Warnung am Ende von <a href="k100269.html#jdbcobjekte">Abschnitt 42.4.5</a>
+deutlich macht).
+</ul>
+
+<p>
+Um dem Entwickler lästige Typkonvertierungen zu ersparen, gibt
+es alle <font color="#000077"><tt>getXXX</tt></font>-Methoden in unterschiedlichen
+Typisierungen. So liefert beispielsweise <a name="ixa103069"><a href="index_g.html#ixb100947"><font color=#000080><tt>getString</tt></font></a></a>
+das gewünschte Feld als <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>,
+während <a name="ixa103070"><a href="index_g.html#ixb102253"><font color=#000080><tt>getInt</tt></font></a></a>
+es als <a href="index_i.html#ixb100244"><font color=#000080><tt>int</tt></font></a>
+zurückgibt. Wo es möglich und sinnvoll ist, werden automatische
+Typkonvertierungen durchgeführt; <a href="index_g.html#ixb100947"><font color=#000080><tt>getString</tt></font></a>
+kann beispielsweise für nahezu alle Typen verwendet werden. <a href="k100267.html#resultsetgetmethoden">Tabelle 42.1</a>
+gibt eine Übersicht über die wichtigsten <font color="#000077"><tt>get</tt></font>-Methoden
+der Klasse <a href="index_r.html#ixb102252"><font color=#000080><tt>ResultSet</tt></font></a>.
+In <a href="k100269.html#sqldatentypen">Tabelle 42.4</a> findet sich
+eine Übersicht der wichtigsten SQL-Datentypen. <a name="resultsetgetmethoden"></a>
+
+<p>
+<table cols=2 border width=66%>
+
+<tr>
+<td valign=top align=left width=40%><b>Rückgabewert</b></td>
+<td valign=top align=left width=60%><b>Methodenname</b></td></tr>
+<tr>
+<td valign=top align=left><a href="index_b.html#ixb100072"><font color=#000080><tt>boolean</tt></font></a>
+</td>
+<td valign=top align=left><a name="ixa103071"><a href="index_g.html#ixb102254"><font color=#000080><tt>getBoolean</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_b.html#ixb100242"><font color=#000080><tt>byte</tt></font></a>
+</td>
+<td valign=top align=left><a name="ixa103072"><a href="index_g.html#ixb102255"><font color=#000080><tt>getByte</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><font color="#000077"><tt>byte[]</tt></font>
+</td>
+<td valign=top align=left><a name="ixa103073"><a href="index_g.html#ixb102256"><font color=#000080><tt>getBytes</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_d.html#ixb100558"><font color=#000080><tt>Date</tt></font></a>
+</td>
+<td valign=top align=left><a name="ixa103074"><a href="index_g.html#ixb102257"><font color=#000080><tt>getDate</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_d.html#ixb100247"><font color=#000080><tt>double</tt></font></a>
+</td>
+<td valign=top align=left><a name="ixa103075"><a href="index_g.html#ixb102258"><font color=#000080><tt>getDouble</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_f.html#ixb100246"><font color=#000080><tt>float</tt></font></a>
+</td>
+<td valign=top align=left><a name="ixa103076"><a href="index_g.html#ixb102259"><font color=#000080><tt>getFloat</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_i.html#ixb100244"><font color=#000080><tt>int</tt></font></a>
+</td>
+<td valign=top align=left><a href="index_g.html#ixb102253"><font color=#000080><tt>getInt</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_l.html#ixb100245"><font color=#000080><tt>long</tt></font></a>
+</td>
+<td valign=top align=left><a name="ixa103077"><a href="index_g.html#ixb102260"><font color=#000080><tt>getLong</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_s.html#ixb100243"><font color=#000080><tt>short</tt></font></a>
+</td>
+<td valign=top align=left><a name="ixa103078"><a href="index_g.html#ixb102261"><font color=#000080><tt>getShort</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+</td>
+<td valign=top align=left><a href="index_g.html#ixb100947"><font color=#000080><tt>getString</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103079"><a href="index_t.html#ixb102262"><font color=#000080><tt>Time</tt></font></a></a>
+</td>
+<td valign=top align=left><a name="ixa103080"><a href="index_g.html#ixb100820"><font color=#000080><tt>getTime</tt></font></a></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103081"><a href="index_t.html#ixb102263"><font color=#000080><tt>Timestamp</tt></font></a></a>
+</td>
+<td valign=top align=left><a name="ixa103082"><a href="index_g.html#ixb102264"><font color=#000080><tt>getTimestamp</tt></font></a></a></td></tr>
+</table>
+<p><i>
+Tabelle 42.1: get-Methoden von ResultSet</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Soll festgestellt werden, ob eine Spalte den Wert <a name="ixa103083"><a href="index_n.html#ixb102265"><font color=#000080><tt>NULL</tt></font></a></a>
+hatte, so kann das <i>nach</i> dem Aufruf der <font color="#000077"><tt>get</tt></font>-Methode
+durch Aufruf von <a name="ixa103084"><a href="index_w.html#ixb102266"><font color=#000080><tt>wasNull</tt></font></a></a>
+abgefragt werden. <a href="index_w.html#ixb102266"><font color=#000080><tt>wasNull</tt></font></a>
+gibt genau dann <a href="index_t.html#ixb100233"><font color=#000080><tt>true</tt></font></a>
+zurück, wenn die letzte abgefragte Spalte einen <a href="index_n.html#ixb102265"><font color=#000080><tt>NULL</tt></font></a>-Wert
+als Inhalt hatte. Bei allen Spalten, die <a href="index_n.html#ixb102265"><font color=#000080><tt>NULL</tt></font></a>-Werte
+enthalten können, <i>muss</i> diese Abfrage also erfolgen. Bei
+den <font color="#000077"><tt>get</tt></font>-Methoden, die ein Objekt
+als Ergebniswert haben, geht es etwas einfacher. Hier wird <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>
+zurückgegeben, wenn der Spaltenwert <a href="index_n.html#ixb102265"><font color=#000080><tt>NULL</tt></font></a>
+war.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel3id042002004"></a>
+<h3>42.2.4 Datenbankänderungen </h3>
+
+<p>
+Datenbankänderungen werden mit den SQL-Anweisungen <a name="ixa103085"><a href="index_i.html#ixb102267"><font color=#000080><tt>INSERT INTO</tt></font></a></a>,
+<a name="ixa103086"><a href="index_u.html#ixb102268"><font color=#000080><tt>UPDATE</tt></font></a></a>
+oder <a name="ixa103087"><a href="index_d.html#ixb102269"><font color=#000080><tt>DELETE FROM</tt></font></a></a>
+oder den SQL-DDL-Anweisungen (<a name="ixa103088"><i>Data Definition Language</i></a>)
+zum Ändern der Datenbankstruktur durchgeführt. Im Gegensatz
+zu Datenbankabfragen geben diese Anweisungen keine Ergebnismenge zurück,
+sondern lediglich einen einzelnen Wert. Im Falle von <a href="index_i.html#ixb102267"><font color=#000080><tt>INSERT INTO</tt></font></a>,
+<a href="index_u.html#ixb102268"><font color=#000080><tt>UPDATE</tt></font></a>
+und <a href="index_d.html#ixb102269"><font color=#000080><tt>DELETE FROM</tt></font></a>
+gibt dieser Wert an, wie viele Datensätze von der Änderung
+betroffen waren, bei DDL-Anweisungen ist er immer 0.
+
+<p>
+Um solche Anweisungen durchzuführen, stellt das Interface <a href="index_s.html#ixb102247"><font color=#000080><tt>Statement</tt></font></a>
+die Methode <a name="ixa103089"><a href="index_e.html#ixb102250"><font color=#000080><tt>executeUpdate</tt></font></a></a>
+zur Verfügung:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public int executeUpdate(String sql)
+ throws SQLException
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/sql/Statement.html" onClick="this.href=getApiDoc('java.sql.Statement')"><font color="#660066" size=-1>java.sql.Statement</font></a></td>
+</tr>
+</table>
+
+<p>
+Auch sie erwartet als Argument einen String mit einer gültigen
+SQL-Anweisung, beispielsweise:
+<font color="#000077">
+<pre>
+INSERT INTO dir VALUES (1, 'x.txt', 0)
+</pre>
+</font>
+
+<p>
+Könnte diese Anweisung erfolgreich ausgeführt werden, würde
+sie 1 zurückgeben. Andernfalls würde eine <a name="ixa103090"><a href="index_s.html#ixb102244"><font color=#000080><tt>SQLException</tt></font></a></a>
+ausgelöst.
+
+<!-- Section -->
+
+<a name="sectlevel3id042002005"></a>
+<h3>42.2.5 Die Klasse <a name="ixa103091">SQLException</a> </h3>
+
+<p>
+Wenn SQL-Anweisungen fehlschlagen, lösen sie normalerweise eine
+Ausnahme des Typs <a href="index_s.html#ixb102244"><font color=#000080><tt>SQLException</tt></font></a>
+aus. Das gilt sowohl, wenn keine Verbindung zur Datenbank zustande
+gekommen ist, als auch bei allen Arten von Syntaxfehlern in SQL-Anweisungen.
+Auch bei semantischen Fehlern durch falsche Typisierung oder inhaltlich
+fehlerhafte SQL-Anweisungen wird eine solche Ausnahme ausgelöst.
+<a href="index_s.html#ixb102244"><font color=#000080><tt>SQLException</tt></font></a>
+ist eine Erweiterung der Klasse <a href="index_e.html#ixb100577"><font color=#000080><tt>Exception</tt></font></a>
+und stellt folgende zusätzliche Methoden zur Verfügung:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+int getErrorCode()
+
+String getSQLState()
+
+SQLException getNextException()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/sql/SQLException.html" onClick="this.href=getApiDoc('java.sql.SQLException')"><font color="#660066" size=-1>java.sql.SQLException</font></a></td>
+</tr>
+</table>
+
+<p>
+Mit <a name="ixa103092"><a href="index_g.html#ixb102272"><font color=#000080><tt>getErrorCode</tt></font></a></a>
+kann der herstellerspezifische Fehlercode abgefragt werden, <a name="ixa103093"><a href="index_g.html#ixb102273"><font color=#000080><tt>getSQLState</tt></font></a></a>
+liefert den internen SQL-Zustandscode. Etwas ungewöhnlich ist
+die Methode <a name="ixa103094"><a href="index_g.html#ixb102274"><font color=#000080><tt>getNextException</tt></font></a></a>,
+denn sie unterstützt die <i>Verkettung</i> von Ausnahmen. Jeder
+Aufruf holt die nächste Ausnahme aus der Liste. Ist der Rückgabewert
+<a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>,
+gibt es keine weiteren Ausnahmen. Code zum Behandeln einer <a href="index_s.html#ixb102244"><font color=#000080><tt>SQLException</tt></font></a>
+könnte also etwa so aussehen:
+<a name="listingid042001"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font>...
+<font color="#555555">002 </font><font color="#0000AA">catch</font> (SQLException e) {
+<font color="#555555">003 </font> <font color="#0000AA">while</font> (e != <font color="#006699">null</font>) {
+<font color="#555555">004 </font> System.err.println(e.toString());
+<font color="#555555">005 </font> System.err.println(<font color="#0000FF">"SQL-State: "</font> + e.getSQLState());
+<font color="#555555">006 </font> System.err.println(<font color="#0000FF">"ErrorCode: "</font> + e.getErrorCode());
+<font color="#555555">007 </font> e = e.getNextException();
+<font color="#555555">008 </font> }
+<font color="#555555">009 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 42.1: Behandeln einer SQLException</i></p>
+
+
+<!-- Section -->
+<a name="sectlevel3id042002006"></a>
+<h3>42.2.6 Die Klasse <a name="ixa103095">SQLWarning</a> </h3>
+
+<p>
+Neben der Klasse <font color="#000077"><tt>SQLException</tt></font>
+für kritische Ausnahmen und Fehler enthält das Paket <font color="#000077"><tt>java.sql</tt></font>
+auch die Klasse <font color="#000077"><tt>SQLWarning</tt></font>.
+Diese wird allerdings nicht geworfen, sondern muss über die Methode
+<font color="#000077"><tt>getWarnings</tt></font> abgerufen werden.
+<font color="#000077"><tt>SQLWarning</tt></font> wird von den Klassen
+<font color="#000077"><tt>Connection</tt></font>, <font color="#000077"><tt>Statement</tt></font>
+und <font color="#000077"><tt>ResultSet</tt></font> unterstützt.
+
+<p>
+Die Methode <font color="#000077"><tt>getWarnings</tt></font> liefert
+Ihnen gegebenenfalls das erste <font color="#000077"><tt>SQLWarning</tt></font>-Objekt
+zur Auswertung zurück. Sollten weitere Warnungen existieren erhalten
+Sie diese über die Methode <font color="#000077"><tt>getNextWarning</tt></font>.
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100265.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100266.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100268.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100271.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
