Асинхронный режим и команда SQLCancel

Некоторые функции ODBC могут работать как синхронно, так и асинхронно. В приложении могут быть разрешены асинхронные операции как для дескриптора инструкции, так и для дескриптора соединения. Если параметр установлен для дескриптора соединения, он затрагивает все дескрипторы инструкции в этом дескрипторе соединения. Приложение использует следующие инструкции, чтобы включить или отключить асинхронный режим:

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);

Когда приложение вызывает функцию ODBC в синхронном режиме, драйвер не возвращает управление приложению, пока не получит уведомление о том, что сервер завершил выполнение команды.

В асинхронном режиме драйвер возвращает управление приложению немедленно, даже перед отправкой команды серверу. Драйвер выставляет код возврата в значение SQL_STILL_EXECUTING. Приложение может выполнять другую работу.

Когда приложение проверяет завершение выполнения команды, делается тот же вызов функции с теми же параметрами для драйвера. Если драйвер еще не получил ответ от сервера, он опять вернет значение SQL_STILL_EXECUTING. Приложение должно проверять команду периодически до тех пор, пока код возврата не станет отличен от SQL_STILL_EXECUTING. Когда приложение получает любой другой код возврата, даже SQL_ERROR, оно может определить, что выполнение команды завершено.

Иногда команда остается необработанной долгое время. Если приложение должно отменить команду без ожидания ответа, это можно сделать при помощи вызова функции SQLCancel с тем же дескриптором инструкции. Это единственный случай, когда следует использовать функцию SQLCancel. Некоторые программисты используют функцию SQLCancel, когда произошла обработка части результирующего набора и нужно отменить оставшуюся часть результирующего набора. Для отмены оставшейся части необработанного результирующего набора следует использовать функции SQLMoreResults или SQLCloseCursor, а не SQLCancel.

См. также

Основные понятия

Создание драйвера ODBC для собственного клиента SQL Server