Partager via


Mode asynchrone et SQLCancel

Certaines fonctions ODBC peuvent fonctionner en mode synchrone ou asynchrone. L'application peut activer les opérations asynchrones pour un descripteur d'instruction ou un handle de connexion. Si l'option est définie pour un handle de connexion, tous les descripteurs d'instruction sur le handle de connexion sont affectés. L'application utilise les instructions suivantes pour activer ou désactiver les opérations asynchrones :

SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);
SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);

Lorsqu'une application appelle une fonction ODBC en mode synchrone, le pilote ne rend pas le contrôle à l'application jusqu'à ce qu'il soit averti que le serveur a terminé la commande.

En mode asynchrone, le pilote rend immédiatement le contrôle à l'application, avant même d'envoyer la commande au serveur. Le pilote définit le code de retour sur SQL_STILL_EXECUTING. L'application peut ensuite effectuer un autre travail.

Lorsque l'application teste l'achèvement de la commande, il effectue le même appel de fonction avec les mêmes paramètres sur le pilote. Si le pilote n'a pas encore reçu de réponse du serveur, il retourne de nouveau SQL_STILL_EXECUTING. L'application doit tester régulièrement la commande jusqu'à ce que le code de retour soit différent de SQL_STILL_EXECUTING. Lorsque l'application obtient un autre code de retour, même SQL_ERROR, elle peut déterminer que la commande est terminée.

Une commande peut parfois rester longtemps en attente. Si l'application doit annuler la commande sans attendre une réponse, il peut le faire en appelant SQLCancel avec le même descripteur d'instruction que la commande en attente. Il s'agit du seul cas où SQLCancel doit être utilisé. Certains programmeurs utilisent SQLCancel lorsqu'ils ont traité une partie du jeu de résultats et souhaitent annuler le reste. SQLMoreResults ou SQLCloseCursor doivent être utilisés pour annuler le reste d'un jeu de résultats en attente, pas SQLCancel.