Во-первых, понимание того, как Control-C отменяет выполнение.Они, вероятно, перехватывают эту последовательность клавиш и делают что-то особенное.Я сильно подозреваю, что клиентские приложения oracle (SQL * Plus и др.) Вызывают OCIBreak () за кулисами и передают дескриптор серверу, который они получили, когда выполняли запрос с предыдущим вызовом OCI.
Я также подозреваю, что Access ничего не делает активно после 60 секунд;это просто время ожидания, которое он запрашивает во время выполнения запроса.Более того, я начинаю задаваться вопросом, запрашивает ли Access этот тайм-аут;все, что я прочитал, говорит, что драйвер ODBC не поддерживает тайм-аут запроса, что заставляет меня думать, что это просто тайм-аут на стороне клиента, но я отвлекся ...
Итак, вернемся к этому вызову OCIBreak (),Вот плохие новости: я не думаю, что ODBC реализует эти вызовы.Чтобы быть на 100% уверенным, вы должны взглянуть на драйвер ODBC для источников оракула, но все, что я прочитал, указывает на то, что вызов API не выставлен.
Для справки, я былпоиск в Google с этими поисковыми терминами в сочетании с "OBDC":
ORA-01013 (error when a user cancelled an operation, or when an operation times out)
OCIBreak (OCI function which cancels a pending operation)
--- EDIT # 1 ---
В качестве примечания, я действительно верючто Access просто отказывается и не отправляет команду отмены любого типа, когда превышен тайм-аут.Если вы посмотрите на эту статью в kb, Драйвер ODBC даже не поддерживает тайм-аут запроса :
PRB: Тайм-аут соединения и тайм-аут запроса не поддерживаются с Microsoft Oracle ODBCДрайвер и поставщик OLE DB
По истечении времени Access, вероятно, просто прекращает прослушивание результатов.Если бы вы попросили оракула получить список запросов, которые все еще выполняются, я сильно подозреваю, что вы все равно увидите ваши перечисленные.
--- EDIT # 2 ---
Что касается реализации вашего собственного «отмена» - который на самом деле не является отменой, то больше «держать интерфейс реагирующим независимо от состояния запроса» - ключевое слово здесь будет асинхронным.Вы захотите переписать свой код, чтобы он выполнялся асинхронно, чтобы он не блокировал обработку сообщений для вашего пользовательского интерфейса.Я бы начал поиск в Google для «доступа к асинхронному запросу» и посмотрел, что всплывает.Получился один SO-результат:
Выполнение асинхронного запроса в MS Access
, а также достойная отправная точка на xtremevbtalk.com:
http://www.xtremevbtalk.com/showthread.php?t=82631
По сути, вместо того, чтобы запускать код, который блокирует выполнение до тех пор, пока не истечет тайм-аут или не будет возвращен набор результатов, вы будете запрашивать доступ, чтобы запустить код за кулисами.Затем вы настроите событие, которое будет срабатывать, когда что-то произойдет, например, когда пользователь узнает, что истекло время ожидания (сбой тайм-аута), заполнит сетку результатами (успех) и т. Д.)