Ich bin unsicher, wie man die Anzahl der betroffenen Zeilen aus einer SQL-Ausführung bezieht.
Ich mag das:
%Vor% und ich kann die Anzahl der betroffenen Zeilen aus der Methode getUpdateCount()
ermitteln. Das ist alles in Ordnung. Das Problem, das ich habe, ist, wenn Update Count ist Null. Dies kann entweder bedeuten:
Es war eine DML-Anweisung, hat aber keine Zeilen beeinflusst. Keine betroffenen Zeilen sind eine gültige Antwort. Ich meine nur, dass einige Bedingungen nicht erfüllt wurden.
Es war eine Nicht-DML-Anweisung (DDL-Anweisung höchstwahrscheinlich) .. die per Definition keine Zeilen ändert, daher ist update count immer Null (duh!). Oder anders ausgedrückt: Das Konzept von update count ist für solche Anweisungen bedeutungslos.
Was ich möchte, ist, zwischen der obigen Situation 1 und 2 unterscheiden zu können . Wie?
Ich bin nicht an Aussagen interessiert, die Ausgabe erzeugen, also könnte ich auch executeUpdate () , aber wie ich es sehe, hat der Rückgabewert dieser Methode denselben Fehler:
Rückkehr:
Entweder (1) die Zeilenanzahl für SQL Data Manipulation Language (DML) -Anweisungen oder (2) 0 für SQL-Anweisungen, die nichts zurückgeben
Arghhh!
Ich wünschte, es wäre:
Rückkehr:
Entweder (1) die Anzahl der Zeilen für SQL Data Manipulation Language (DML) -Anweisungen oder (2) -1 für SQL-Anweisungen, die nichts zurückgeben
(Hinweis: Ich kenne den Inhalt von arbitrarySQLCommand
vorher nicht)
Es scheint einfach keine echte JDBC-ähnliche Lösung für das Problem zu sein. Meiner Meinung nach haben die Entwickler von JDBC einen schwerwiegenden Fehler in getUpdateCount
gemacht, indem sie den Wert 0 (null) verwendet haben, um eine Anweisung zu bezeichnen, die (per Definition) keine Zeilen betrifft, weil null betroffene Zeilen ebenfalls ein perfekt gültiger Wert für ist das Ergebnis einer DML-Anweisung.
Die einzige mögliche Lösung scheint darin zu bestehen, eine Art Mustererkennung für die SQL-Anweisung durchzuführen, um herauszufinden, ob es sich um eine DML-Anweisung (INSERT, UPDATE, DELETE) oder einen anderen Typ von SQL-Anweisung handelt. Etwas wie das:
arbitrarySQLCommand
. Ein Wort wird beendet
entweder durch ein Leerzeichen oder ein EOL-Zeichen. getUpdateCount()
ist relevant, ansonsten die
Ausgabe von getUpdateCount()
ist irrelevant. Hässlich und fehleranfällig. Aber die einzige mögliche Lösung, die aus dieser SO-Frage kam. : - (
Vielleicht hilft mir meine Antwort nicht bei dem, was Sie genau gefragt haben, aber ich kam hierher, als ich nach der Ausführung einer DML die betroffene -Zeilenanzahl suchte, nicht gefunden Zeilenanzahl - mit MySQL. Und ich schreibe hier, was ich gefunden habe, um anderen zu helfen.
Mein Problem war, dass wenn ich eine Anweisung ausführe, die in der Tabelle keine Änderungen vornimmt, zum Beispiel
%Vor% method Statement.executeUpdate(...)
hat die Anzahl der gefundenen Zeilen zurückgegeben, nicht die Anzahl der geänderten / betroffenen Zeilen. So konnte ich nicht sagen, ob die Abfrage etwas in der Tabelle geändert hat.
Um dies zu ändern, sollte eine Option in der URL angegeben werden, wenn die Verbindung erstellt wird (mit DriverManager.getConnection()
), wie folgt:
jdbc:mysql://${jdbc.host}/${jdbc.db}?
useAffectedRows=true
Ich habe es hier gefunden:
Und MySQL-Dokumentation: