PreparedStatement - Fehleranalyse

Klein0r

Erfahrenes Mitglied
Hallo zusammen,

ich erstelle ein Prepared Statement mit x Variablen. Jetzt setze ich alle x Postionen mit den entsprechenden set-Funktionen und führe das PreparedStatement aus.

Wenn es nun aus irgend einem Grund zu einer SQL-Exception kommt würe ich gerne den kompletten (zusammengesetzten) SQL-Query + den Spaltennamen der den Fehler verursacht hat. Sei es durch falschen Datentyp ODER falschen Wert.

Wie könnte man das realisieren?
Die SQL-Exception gibt nicht viel her...
Code:
A truncation error was encountered trying to shrink VARCHAR 'testeinstest' to length 10.

Habt ihr einen Ansatz?

lg
 
Die SQL Exception sagt doch alles aus....

Du verkleinerst eine VARCHAR Spalte....aber für testeinstest reicht der neue Platz von 10 Zeichen nicht.

Und :google: hätte dir auch nach kürzester Zeit geholfen^^;
 
Also lesen und englisch kann ich auch. Danke...
Lies folgendes nochmal:

Wenn es nun aus irgend einem Grund zu einer SQL-Exception kommt würe ich gerne den kompletten (zusammengesetzten) SQL-Query + den Spaltennamen der den Fehler verursacht hat ausgeben. Sei es durch falschen Datentyp ODER falschen Wert.

Und für welche Spalte war laut der SQL-Exception der String zu lang?
Weiß man nicht. Und genau das will ich lösen...

Danke und lg
 
Naja wie genau man ein PrepareStatement benutzt muss ich ja nun nicht beschreiben denke ich. Das ist ja bekannt...

Die Exception tritt logischerweise genau in der Zeile auf wo ich den Query absetzen will:
Code:
ResultSet result = prepared.executeQuery();

Das Problem ist, dass die prepared.setString(..)-Methode natürlich nicht weiß wie groß das Feld ist in das später der Wert eingetragen werden soll. String ist erstmal String. Egal wie lang. Auch der Datentyp für die entsprechende Position ist egal. Das funktioniert ja erstmal.

Das Problem ist, dass die Daten extern eingefügt werden (auch die Vorlage für das PreparedStatement). Also ich weiß nicht in welche Tabelle später die Daten geschrieben werden und wieviele Spalten etc.

Das Problem ist, dass ich mir nun soetwas wünsche wie:
Code:
String kompletterQuery = prepared.getQuery();
(wo also alle Fragezeichen (?) durch die Werte gesetzt sind die ich übergeben habe)

Dann könnte ich ja zusammen mit dem Wert der falsch geschrieben wurde (testeinstest) anhand der Position im Query bestimmen in welcher Spalte das Problem aufgetreten ist.

Aber das halte ich für sehr umständlich.
Daher existiert dieser Thread: Für die Suche nach anderen Lösungen!

lg
 
Um das hier ab zu schließen (ich hasse es, wenn ich ein Problem habe und einen Thread mit genau dem gleichen Problem finde der nicht abgeschlossen wurde)

Ich habe einen richtigen Umweg gewählt soweit ich mich noch erinnern kann. Erst habe ich den Insert-String komplett zerlegt (so dass ich weiß wie welche Spalten heißen) und dann habe ich anhand des Wertes den ich einfügen wollte den Index festgestellt.

Also bei
Code:
Inser into bla (spalte1, spalte2, spalte3) values ('test', 'test222', 'test333');

hab ich Anhand der Reihenfolge feststellen können, welche Spalte beispielsweise zu 'test222' gehört - wenn der Insert fehl geschlagen ist.

lg und erledigt.
Schönes Wochenende
 
Hallo,

eine weitere Möglichkeit die von einem PreparedStatement gebundenen Parameterwerte ausgeben zu lassen ist das logging des entsprechenden JDBC Treibers zu verwenden. Viele JDBC Treiber bieten entsprechende JVM Parameter an die man beispielsweise beim Starten der Anwendung in etwa mit -Dsome.jdbc.driver.property.enable.logging=true angeben kann.

Diese Möglichkeit ist etwas weniger invasiv als an allen möglichen Stellen "eigene" Tracing-Aware JDBC PreparedStatements zu verwenden.

Gruß Tom
 

Neue Beiträge

Zurück