Асинхронный режим и команда 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.