SQLException: Lässt sich der Fehler feststellen?

Status
Nicht offen für weitere Antworten.

Grizzly

Top Contributor
Ich habe eine PostgreSQL Datenbank und pflege Daten ein.

Jetzt kann mir u.U. an der Stelle, an der ich den Datensatz in die Datenbank speichere, eine SQLException geworfen werden. Das kann bspw. dadurch passieren, dass die Netzwerkverbindung streikt. Die Ausnahmen kann aber auch durch Verletzung der Unique Regel einer Spalte oder Verletzung ausgelöst werden.

Und in diesem Fall würde ich gerne eine entsprechende Meldung an den Benutzer ausgeben bzw. den entsprechenden Dialoge geöffnet lassen, so dass der Benutzer das entsprechende Feld anpassen kann. Ich habe schon versucht den PostgreSQL JDBC 2 Treiber mit sqlexception.getErrorCode() auszuquetschen. Dort steht aber immer 0 drin.

Mach ich etwas falsch? Gibt es eine andere Möglichkeit?
 
G

Guest

Gast
Grizzly hat gesagt.:
Ich habe eine PostgreSQL Datenbank und pflege Daten ein.

Jetzt kann mir u.U. an der Stelle, an der ich den Datensatz in die Datenbank speichere, eine SQLException geworfen werden. Das kann bspw. dadurch passieren, dass die Netzwerkverbindung streikt. Die Ausnahmen kann aber auch durch Verletzung der Unique Regel einer Spalte oder Verletzung ausgelöst werden.

Und in diesem Fall würde ich gerne eine entsprechende Meldung an den Benutzer ausgeben bzw. den entsprechenden Dialoge geöffnet lassen, so dass der Benutzer das entsprechende Feld anpassen kann. Ich habe schon versucht den PostgreSQL JDBC 2 Treiber mit sqlexception.getErrorCode() auszuquetschen. Dort steht aber immer 0 drin.

Mach ich etwas falsch? Gibt es eine andere Möglichkeit?
Frage Dich zuerst, was es dem Anwender bringt, wenn Du einen Datenbankfehler in Klartext benennst?
Fehler wie "Verletzung der Unique Regel" sind Programmierfehler, die nicht auftreten sollten, wenn
Du alles korrekt machst. Das gleiche gilt für "required" Felder etc. Dies solltest Du schon früher prüfen,
also bevor Du die SQL-Statements absetzts. Ansonsten alle ungewöhnlichen Fehler mit z.B. Log4J loggen,
um später die Ursachen rausfinden und beheben zu können.
"Leitung dicht" oder ähnliches, sind vielleicht die einzigen Ausnahmen. Prüfe bei den SQLExceptions mit
sqlException.getCause(), was dahinter steckt.

SQLException sollte wirklich eine Ausnahme bleiben, wenn alles korrekt ist.
 

Grizzly

Top Contributor
Wie soll ich prüfen ob es bspw. einen Kunden mit dem gleichen Namen nochmal gibt? Dann müsste ich vorher eine Transaktion starten, in dieser mit einem SELECT prüfen, ob es einen gleichnamigen Kunden gibt und dann ggf. abbrechen. Bei einem Feld geht das ja noch. Sind bspw. jedoch meherere Felder jedoch UNIQUE, müsste ich erst alle durchprüfen. ???:L

Oder an was dachtest Du da? :bahnhof:
 
G

Guest

Gast
Genau so war es auch gemeint. Exceptions sind ja Ausnahmen, kein Mittel,
um semantische Fehler abzufangen.

Wenn es um Batchbetrieb geht, dann wird die Sache komplizierter, kann aber
auch einfach gelöst werden.

- temporäre Tabelle mit Kunden anlegen
- diese mit den Daten füllen
- alle aus der temprären Tabelle löschen, die bereits in der Haupttabelle vorhanden sind
- die übrigen in die Tabelle eintragen.

Das ganze in einer Transaktion, versteht sich.
Bei einzelnen Datensätzen ist es dann noch einfacher. Diese paar Abfragen davor
kosten ja kaum Zeit. Es ist eine Sache von paar Millisekunden.

Um es noch weiter zu führen... SQLExceptions haben clientseitig auch nichts zu suchen,
sollten bereits in der Persistenzschicht abgefangen und in entsprechende UserExceptions
mit mehr Informationsgehalt umgewandelt werden.
z.B. "Nachname darf nicht fehlen" etc. bei required Feldern oder "Benutzer existiert bereits"
bei unique Feldern und beim Client nachfragen, ob die Daten des bestehende Kunden
geladen werden sollen (oder sie gleich anzeigen).

Manchmal kann das Speichern auch die Bedeutung haben
"Speichern wenn noch nicht vorhanden, sonst Klappe halten und fortsetzen"

Denke immer an den Anwende bzw. welche Information ist für ihn überhaupt relevant
sind und auf was hat er überhaupt Einfluss.
 
G

Guest

Gast
:autsch: Der letzte Satz sollte wie folgt lauten

Denke immer an den Anwende bzw. welche Information für ihn überhaupt relevant
sind und auf was er überhaupt Einfluss hat.
 
G

Guest

Gast
OK, letzter Versuch. Ich sollte heute nichts mehr schreiben, sonst wird es
peinlich. ;)

Denke immer an den Anwender bzw. welche Informationen für ihn überhaupt
relevant sind und auf was er Einfluss hat.

--------------------------
Übrigens. Manche SQL Dialekte erlauben in ihrer Syntax solche Fälle
auszuschliessen.
z.B. in mySQL (aus dem Handbuch)

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

Besser ist aber die SELECT-vor-UPDATE Lösung, da sie auf andere Datenbanksysteme
portierbar ist.
 

Grizzly

Top Contributor
Hm, hm, hm, ... Ja, wahrscheinlich ist das die beste (und einzige? ???:L) Möglichkeit.
Schankedön. :)
 

Grizzly

Top Contributor
Jetzt bin ich gerade nur auf ein Problem gestoßen: Ich kann ja gar nicht UNIQUE Spalten im Voraus feststellen, da ich die UNIQUE Spalten nicht bestimmen kann. Zumindest bietet ResultSetMetaData dazu keine Möglichkeit. :(
 

Grizzly

Top Contributor
Anonymous hat gesagt.:
Du kennst aber den Tabellenaufbau. ;)
Nicht, wenn ich das ganze in die ganze Datenbankzugriffe über eigene Klasse abstrahiere möchte und für mehrere Tabellen / Datenbanken verwende. Dann kennt die Klasse bzw. die Bibliothek den Aufbau nicht. Außer ich hinterlege den Aufbau nochmal in einer extra Datei oder setze die Unique Felder über eine entsprechende Methode der Klasse.

Alternativ könnte ich noch versuche die Datenbank per Datenbanksystem spezifischem SQL über den Aufbau auszuquetschen. Das müsste ich dann halt für jedes (R)DBMS extra implementieren (sprich einmal bspw. für PostgreSQL, einmal für MySQL, einmal für HSQLDB, usw.).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V SQLite java.sql.SQLException: no such column: Datenbankprogrammierung 18
D MySQL SQLException time zone value is unrecognized Datenbankprogrammierung 2
M Oracle SQLException: Verbindung getrennt Datenbankprogrammierung 2
S MySQL SQLException Parameter index out of range (1 > number of parameters, which is 0). Datenbankprogrammierung 10
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
nrg Oracle java.sql.SQLException Ungültiger Vorgang bei schreibgeschützter Ergebnismenge Datenbankprogrammierung 0
N SQL-Statement SQLException: the '|' object Datenbankprogrammierung 3
N SQL-Statement SQLException: '' is not a valid name. Datenbankprogrammierung 7
Y java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state Datenbankprogrammierung 2
H Derby/JavaDB SQLException wenn die Datenbank in eine Jar gepackt wurde. Datenbankprogrammierung 6
I java.sql.SQLException: No data found Datenbankprogrammierung 3
T java.sql.SQLException: unexpected end of statement Datenbankprogrammierung 2
H java.sql.SQLException: Access denied for user 'root'@'localhost' (using password : YES) Datenbankprogrammierung 1
D getConnection mit SQLException Datenbankprogrammierung 7
F SQLException fangen beim verbinden mit Hibernate Datenbankprogrammierung 17
D java.sql.SQLException Datenbankprogrammierung 3
S SQLException: No suitable driver bei DB2 Datenbankprogrammierung 4
J Einstellungen für die Ausnahme SQLException Datenbankprogrammierung 7
M java.sql.SQLException: Unable to open file Datenbankprogrammierung 2
M java.sql.SQLException: out of memory Datenbankprogrammierung 18
zilti java.sql.SQLException: Before start of result set Datenbankprogrammierung 2
C FM: java.sql.SQLException: Geschlossene Ergebnismenge: next Datenbankprogrammierung 7
A Problem: java.sql.SQLException Datenbankprogrammierung 5
I hilfe! java.sql.SQLException Datenbankprogrammierung 7
M java.sql.SQLException: No data found Datenbankprogrammierung 9
K MsAccess immer beim zweiten Update java.sql.SQLException Datenbankprogrammierung 28
C SQLException wenn String auf VARCHAR geschrieben wird Datenbankprogrammierung 10
R MySQL denies access to data source - java.sql.SQLException Datenbankprogrammierung 14
L SQLException --> Übersetzung nötig! Datenbankprogrammierung 2
G SQLException: No operations allowed after connection closed Datenbankprogrammierung 2
K java.sql.SQLException: Before start of result set Datenbankprogrammierung 2
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
M Derby/JavaDB Neu geschriebener Eintrag per UPDATE lässt sich nicht unmittelbar abrufen Datenbankprogrammierung 2
F HSQLDB HSQLDB lässt mich nicht auf erstellte Tabelle zugreifen Datenbankprogrammierung 12
A MySQL Parallel laufende EntityManager kommen sich in die Quere Datenbankprogrammierung 1
X Lohnt sich sqllite? Datenbankprogrammierung 5
DStrohma Kann sich jemand mal diese DB-Struktur ansehen? Datenbankprogrammierung 2
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
A SQL-Befehle lassen sich nicht ausführen Datenbankprogrammierung 6
F [DB4O] Objekte sollen sich nicht verändern Datenbankprogrammierung 5
D MySQL Client - Server: Client verabschiedet sich sobald ich Variablen im SQL Statement verwende Datenbankprogrammierung 9
N Trennt sich die Verbindung zur DB (MySQL) automatisch? Datenbankprogrammierung 3
M Mysql hängt sich auf Datenbankprogrammierung 15
T MySQL: Join auf sich selbst schlägt fehlt Datenbankprogrammierung 3
V Welche Datenbank eignet sich? Pflegeaufwand? Datenbankprogrammierung 4
Saxony Benachrichtigung wenn sich Datenbank ändert Datenbankprogrammierung 10
G Zahlen sich stored Procedures wirklich aus? Datenbankprogrammierung 12
G Wie fragt man Bilder ab die sich in einer DB befinden?? Datenbankprogrammierung 2

Ähnliche Java Themen


Oben