1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
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>
|