J'ai une simple déclaration d'insertion SQL de la forme:Pourquoi "insérer (...) valeurs (...)" n'a pas pu insérer une nouvelle ligne?
insert into MyTable (...) values (...)
Il est utilisé à plusieurs reprises pour insérer des lignes et fonctionne habituellement comme prévu. Il insère exactement 1 ligne dans MyTable, qui est également la valeur renvoyée par l'instruction Delphi AffectedRows: = myInsertADOQuery.ExecSQL.
Après un certain temps, il y avait un problème de connectivité réseau temporaire. Par conséquent, d'autres threads de la même application ont perçu EOleExceptions (Échec de connexion, -2147467259 = erreur non spécifiée). Plus tard, la connexion réseau a été rétablie, ces threads reconnectés et étaient bien.
Le thread responsable de l'exécution de l'instruction d'insertion décrite ci-dessus n'a cependant pas perçu les problèmes de connectivité (aucune exception) - probablement il n'a tout simplement pas été exécuté alors que le réseau était arrêté. Mais après les problèmes de connectivité réseau, myInsertADOQuery.ExecSQL renvoyait toujours 0 et aucune ligne n'était plus insérée dans MyTable. Après un redémarrage de l'application, l'instruction d'insertion a de nouveau fonctionné comme prévu.
Pour SQL Server, existe-t-il un cas défini dans lequel une instruction d'insertion comme celle ci-dessus n'insère pas de ligne et renvoie 0 comme nombre de lignes affectées? La clé primaire est un GUID autogénéré. Il n'y a pas de contraintes uniques ou de vérification (ce qui devrait entraîner une exception de toute façon plutôt que de ne pas insérer une ligne).
Y a-t-il des bogues ADO connus (Fournisseur = SQLOLEDB.1)?
Autres explications de ce comportement?
Merci, Nang.
avez-vous trace le résultat avec l'outil SQL profileur qui vient avec SQL Server? La première réponse à cette question a une vidéo expliquant comment faire cela: http://stackoverflow.com/questions/504326/trace-file-how-to-use-it –
Non, je ne l'ai pas fait. Merci pour l'indice. Si cela se reproduit, je vais essayer. – nang