Ich verwende den offiziellen Sybase-JDBC-Treiber, um eine Verbindung zu einer Datenbank herzustellen und eine gespeicherte Prozedur aufzurufen, indem ich ein CallableStatement-Objekt erstelle, die Parameter daran bindest und .execute() darauf aufruft.Warum "ißt" der Sybase JDBC-Treiber die Ausnahmen?
Allerdings habe ich festgestellt, dass keine Ausnahme ausgelöst wird, auch wenn die gespeicherte Prozedur fehlschlägt. Ich kann überprüfen, ob der Fehler an mich weitergegeben wurde, indem ich den Datenverkehr mit Wireshark in die Datenbank geschnüffelt und die Fehlermeldungen beobachtet habe, die zurückkommen.
Schließlich fand ich, dass .executeUpdate mit() anstelle von .execute() mir die Ausnahmen nicht geben, jedoch habe ich noch zwei Fragen offen:
- Warum sind .execute() und .executeUpdate() verhält sich anders? Von der SUN-Dokumentation der Schnittstelle scheint es, dass sie (fast) das gleiche tun sollten ...
- Ist es immer angemessen, .execute() mit .executeUpdate() beim Aufrufen einer gespeicherten Prozedur zu ersetzen? Muss die gespeicherte Prozedur bestimmten Anforderungen entsprechen, damit sie mit .executeUpdate() aufgerufen werden kann? (Zum Beispiel muss ein Update haben/Löschen/Insert-Anweisung als letzten Schritt?)
aktualisieren: Ich habe jTDS versucht, und es verhält sich korrekt (wie in: die SQLException in beide wirft Fälle - mit .execute() und mit .executeUpdate()). Aufgrund von Einschränkungen, die außerhalb meiner Kontrolle liegen, ist es jedoch nicht möglich, den Treiber auszuschalten.
Auch: Ich bin nicht interessiert an das Ergebnis von dieser gespeicherten Prozedur zurückgegeben, es ist ein Einfüge-/Update-Typ-Verfahren. Ich würde nur eingefügt werden, um zu sehen (und in der Lage sein zu fangen/loggen), wenn es scheitert oder nicht. Eine andere Sache, die ich versucht habe, ist, die Warnungen nach .execute() aus der Verbindung zu bekommen, aber es enthielt auch nichts.
verhalten sich andere Treiber gleich? Was ist mit jTDS? http://jtds.sourceforge.net/ –