Wie wird die Anzahl der Zeilen angegeben, die von der JDBC-Ausführung geändert wurden?

8

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:

  1. 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.

  2. 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)



Endgültige Lösung

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:

  1. Extrahiere das erste Wort aus arbitrarySQLCommand . Ein Wort wird beendet entweder durch ein Leerzeichen oder ein EOL-Zeichen.
  2. Wenn dieses Wort (Ignorieren Fall) ist entweder INSERT, UPDATE oder DELETE, dann ist es eine DML-Anweisung und die Ausgabe von 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. : - (

    
peterh 09.07.2013, 09:31
quelle

2 Antworten

4

Das Beste, was Sie tun können, ist das Überprüfen der SQL-Anweisung

%Vor%     
sanbhat 09.07.2013, 09:43
quelle
5

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:

Ссылка

    
True Soft 11.01.2014 21:19
quelle

Tags und Links