Que signifie l'Énoncé.executeUpdate() retourne -1?
Une requête qui fonctionne dans la gestion de l'atelier et dans le executeUpdate
fait que même executeUpdate
retour -1
, ce qui n'est pas défini dans les documents que nous pouvons trouver. Son censé retourner uniquement le nombre de lignes ou de 0
. Qu'est-ce que cela signifie? Le pilote JDBC-ODBC bridge si ce qui compte.
Exemple:
String query = "IF NOT EXISTS (SELECT * FROM animals WHERE animal_name ='" + a +"') INSERT INTO " + table + " (animal_name, animal_desc, species_id) VALUES ('" + a + "', '" + b + "', " + c + ")";
int result = statement.executeUpdate(query);
System.out.println(result);
La requête fonctionne, que la ligne est ajoutée à la base de données, c'est juste étrange qu'il renvoie -1 où la documentation dit qu'elle ne retourne 0 ou le nombre de lignes (comme je l'ai été corrigées).
Mise à JOUR:
L'exécution de cette dans Management Studio résultats avec "la Commande s'est terminée correctement."
IF NOT EXISTS (SELECT * FROM animals WHERE animal_name = 'a')
INSERT INTO animals(animal_name, animal_desc, species_id) VALUES ('a', 'a', 1)
Qui devrait signifier la méthode doit retourner 0, car il ne retourne rien, c'est exact?
- Pouvez-vous nous donner un morceau de code montrant ce?
- Je serais très intéressé de voir votre code. Et vous êtes un peu incorrect, quand vous dites,
executeUpdate(...)
est censé renvoyer seulement de 1 ou de 0...il retourne en fait, soit (1) le nombre de lignes de SQL Langage de Manipulation de Données (DML) ou (2) 0 pour les instructions SQL qui renvoie rien - ne peut pas être -1. Le executeUpdate() renvoie le nombre de lignes de commandes INSERT, UPDATE ou DELETE, ou 0 pour les instructions SQL qui renvoie rien
- ne vous utilisez Microsoft SQL?
- Mise à jour de la question avec le code et les corrections.
- La base de données?
- Oui, nous sommes à l'aide de SQL Server 2008.
- utilisez-vous le getUpdateCount() n'importe où dans votre code?
- Vous devriez vraiment envisager d'afficher votre plus récente édition comme une réponse.
- Fait.
- Cela m'est juste arrivé. Quelqu'un a modifié le grant de la procédure que mon appel et j'ai perdu l'appel d'autorisation sur cette procédure. La connexion avec la base de données est ok, mais lorsque j'ai invoqué la procédure par le Serveur d'Application, qu'il a enregistré l'-1 comme le résultat de la cstmResult: int cstmResult = mstc.executeUpdate(); Heureusement, il était facile de déceler la cause en raison de la journalisation des fichiers: L'autorisation d'EXÉCUTION a été refusée sur l'objet '...'
Vous devez vous connecter pour publier un commentaire.
Que l'exécution d'une instruction n'est pas réellement DML (par exemple
UPDATE
,INSERT
ouEXECUTE
), mais un morceau de T-SQL qui contient DML, je pense qu'elle n'est pas traitée comme une mise à jour de la requête.Section 13.1.2.3 de JDBC 4.1 spécification membres de quelque chose (plutôt difficile à interpréter btw):
Compte tenu de cette information, je suppose que
executeUpdate()
en interne unexecute()
, et puis - commeexecute()
sera de retourfalse
- il sera de retour la valeur degetUpdateCount()
, qui, dans ce cas, conformément à l'JDBC spec - sera de retour-1
.Ceci est corroboré par le fait 1) que la Javadoc de
Déclaration.executeUpdate()
dit:Et 2) que la Javadoc de L'énoncé.getUpdateCount() spécifie:
Juste pour clarifier: compte tenu de la Javadoc pour
executeUpdate()
le comportement est probablement faux, mais il peut être expliqué.Aussi comme je l'ai commenté ailleurs, l'-1 peut juste indiquer: peut-être que quelque chose a été changé, mais nous ne savons tout simplement pas, ou nous ne pouvons pas donner le nombre exact de changements (par exemple, parce que dans cet exemple, c'est un morceau de T-SQL est exécutée).
Donc 4 ans plus tard, Microsoft a rendu disponible leur pilote JDBC sur Github. J'ai eu une notification à propos de cette question aujourd'hui, et je suis allé jeté un oeil, et je crois avoir trouvé le coupable ici,
mssql-jdbc/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerStatement.java:1713
.Fondamentalement, le pilote essaie de comprendre ce que SQL Server envoie en retour si ce n'est pas un résultat déterminé ensemble. Selon les commentaires, il va comme ceci:
(L'emphase est mienne)
Si vous les gars ont bien à la fin. SQL ne peuvent tout simplement pas dire combien de lignes sont affectées, et par défaut,
-1
. 🙂Je n'ai pas vu cela nulle part, soit, mais mon instinct serait que cela signifie que le
IF
empêché l'intégralité de la déclaration de l'exécution.Essayez d'exécuter l'instruction avec une base de données où les
IF
passe.Également vérifier s'il ya des déclencheurs qui peuvent changer le résultat.
[MODIFIER] Quand que dit la norme que cette fonction ne devrait jamais retourner
-1
, qui n'a pas appliquer cette. Java n'a pas de pré-et post-conditions. Un pilote JDBC pourrait retourner un nombre aléatoire et il n'y avait pas moyen de l'arrêter.Si il est important de savoir pourquoi cela se produit, exécutez l'instruction sur différentes bases de données jusqu'à ce que vous avez essayé tous les chemins d'exécution (c'est à dire celui où le
IF
retournefalse
et celui où il retournetrue
).Si ce n'est pas si important que cela, le marquer comme une "astuce" par un ingénieur Microsoft et rappelez-vous combien vous avez aimé quand vous vous sentez comme faire le malin vous-même la prochaine fois.
IF
déclaration de travaux, le code a été assez bien copier-collé à partir d'une requête dans Management Studio qui a été testé avant il a été mis dans le programme. LeINSERT
instruction fonctionne parce que la ligne est affichée si vous faites unSELECT
déclaration par la suite.IF
renvoie le résultat inverse?Statement.setFetchSize()
-1
, peut-être que Microsoft a décidé que -1 signifie "peut-être que quelque chose a changé, mais nous ne sommes pas sûr".Pour executeUpdate déclarations contre une base de données DB2 pour z/OS serveur, la valeur qui est renvoyée dépend du type de l'instruction SQL qui est en cours d'exécution:
Pour une instruction SQL qui peut avoir un nombre de mise à jour, comme une instruction INSERT, UPDATE ou DELETE, la valeur retournée est le nombre de lignes affectées. Il peut être:
Un nombre positif, en l'absence d'un certain nombre de lignes concernées par l'opération et l'opération n'est pas une suppression en masse sur une table sectorielle de l'espace.
0, si les lignes sont affectées par l'opération.
-1, si l'opération est une suppression en masse sur une table sectorielle de l'espace.
Pour une base de données DB2 instruction d'APPEL, une valeur de -1 est renvoyé, parce que la base de données DB2 server ne peut pas déterminer le nombre de lignes affectées. Les appels à getUpdateCount ou getMoreResults pour une instruction d'APPEL a également renvoyer -1.
Pour toute autre instruction SQL, la valeur -1 est renvoyée.
-1
...Cela n'explique pas pourquoi il devrait être comme cela, mais il explique pourquoi cela pourrait se produire. La suite de byte-code définit
-1
à l'intérieur de laupdateCount
drapeau dans leSQLServerStatement
constructeur:Maintenant, je ne vais pas analyser toutes les possibilités de contrôle des flux, mais je voudrais simplement dire que c'est la valeur par défaut interne initialisation de la valeur que d'une certaine façon les fuites de code client. Remarque, cela se fait aussi dans d'autres méthodes:
En d'autres termes, vous êtes probablement sûr de l'interprétation
-1
le même que0
. Si vous misez sur cette valeur de résultat, peut-être rester sur le côté sécuritaire et faire vos vérifications comme suit:Mise à JOUR: lors de la lecture de Marque Rotteveel réponse, j'ai tendance à être d'accord avec lui, en supposant que
-1
est JDBC-conforme de la valeur pour "inconnu mise à jour de compte". Même si ce n'est pas documenté sur la méthode de la Javadoc, il est documenté dans le JDBC spécifications, chapitre 13.1.2.3 de Revenir Inconnu ou Plusieurs Résultats. Dans ce cas, il pourrait être dit qu'uneIF .. INSERT ..
déclaration aura un "inconnu nombre de mise à jour", que cette déclaration n'est pas SQL conformes à la norme de toute façon.