ADO/SQL Server: qu'est-Ce que le code d'erreur pour le “délai d'attente expiré”?
je suis en train d'essayer de piéger un "délai d'attente expiré erreur" d'ADO.
Lorsqu'un délai d'attente se produit, ADO retourne:
Number: 0x80040E31 (DB_E_ABORTLIMITREACHED in oledberr.h)
SQLState: HYT00
NativeError: 0
La NativeError
de zéro logique, car le délai d'attente n'est pas une fonction du moteur de base de données (c'est à dire de SQL Server), mais d'ADO interne du mécanisme d'expiration.
La Number
(c'est à dire le hresult COM) paraît utile, mais le définition de DB_E_ABORTLIMITREACHED
dans oledberr.h
dit:
Exécution s'est arrêtée en raison d'un plafond de ressources a été atteint. Aucun résultat n'a été renvoyé.
Cette erreur pourrait s'appliquer à d'autres choses que les "délai d'attente expiré" (certains potentiellement côté serveur), comme un gouverneur qui limite:
- Utilisation de l'UC
- I/O des lectures/écritures
- la bande passante du réseau
et s'arrête une requête.
La dernière pièce utile est SQLState
, qui est une base de données indépendante de code d'erreur système. Malheureusement, la seule de référence pour les codes d'erreur SQLState je peux trouver ont pas fait mention de HYT00
.
Quoi faire?
Que dois-faire?
Remarque: je ne peux pas faire confiance
0x80040E31 (DB_E_ABORTLIMITREACHED)
pour dire "délai d'attente expiré", pas plus que je pouvais avoir confiance
0x80004005 (E_UNSPECIFIED_ERROR)
pour dire "Opération a été bloquée sur les ressources par un autre processus et a été choisie comme victime du blocage".
Mon pseudo-question devient: est-ce que quelqu'un a de la documentation sur ce que le SQLState "HYT000
"?
Et ma vraie question demeure: Comment puis-je précisément de piéger un ADO délai d'attente expiré exception levée par ADO?
Dois aimer les questions où le développeur est d'essayer de "faire la bonne chose", mais personne ne sait comment de faire la bonne chose. Aussi dois aimer comment googler pour DB_E_ABORTLIMITREACHED
et cette question est d' #9, avec MSDN nulle part pour être trouvée.
Mise à jour 3
De la OLEdb ICommand.Exécuter référence:
DB_E_ABORTLIMITREACHED
L'exécution a été annulée en raison d'un plafond de ressources a été atteint. Par exemple, une requête a expiré. Aucun résultat n'a été renvoyé.
"Par exemple", ce qui signifie pas d'une liste exhaustive.
Mise À Jour De Trois
Trouvé. Réponse appliquée comme réponse.
OriginalL'auteur Ian Boyd | 2010-06-04
Vous devez vous connecter pour publier un commentaire.
Vous peut utiliser en toute sécurité
HYT00
à dire "Délai d'attente expiré". La suivante vient de Microsoft SQLSTATEs de référence. Il mentionne laHYT00
SQLSTATE:Qui relie ensuite à Annexe A: ODBC Codes d'Erreur de Référence du Programmeur ODBC, qui documente la
SQLSTATE
valeurs:HYT00
Délai d'attente expiré, et il est intéressant de noter égalementHYT01
Délai de connexion expiréDe sorte que vous pouvez utiliser HYT00 pour "Délai d'attente expiré".
OriginalL'auteur Ian Boyd
Est-il pas juste
-2
ou est-il trop évident?Vous pouvez générer dans SSMS et de Ado.net et nous nous en servons pour décider de réessayer.
Vieille Question et un lien et MSDN
-2
? Rien n'est de retour -2. HRESULT à partir de l'appel de l'ADO à l'objet COM est0x80040E31
. Après l'échec de HRESULT, leConnection
de l'objetErrors
collection contient une erreur, avec unSQLState
de"HYT00"
etNativeError
de0
.Nous obtenons -2 à plusieurs endroits .net et SSMS. Et donc faire beaucoup d'autres personnes de par mes liens. Quels sont exactement vous faire à ce niveau? vous mentionnez ADO, COM, ODBC et SQL Server
hresult = connection.Execute(commandText, recordsAffected, adExecuteNoRecords);
hresult contiendra0x80040E31
.connection.Errors
collection contiendra les membres, avec l'SQLState
être"HYT00"
, etNativeError
de 0. Vous êtes confusADO
(native des objets COM) avecADO.net
(.NET objets gérés)Dans mon cas,
-2
est pas du tout évident. Non seulement je n'ai pas les -2 revint vers moi, mais il ne semble plus correct que -42 (dont je ne reçois pas)OriginalL'auteur gbn