MS Access отменить выполнение сочетания клавиш для сквозного запроса - PullRequest
0 голосов
/ 17 января 2012

При использовании сквозных запросов SQL в MS Access по умолчанию устанавливается тайм-аут 60 секунд, после чего на удаленный сервер отправляется инструкция для отмены запроса. Можно ли в любом случае отправить эту команду с клавиатуры, аналогично операции «Ctrl + Break» в Access?

1 Ответ

2 голосов
/ 05 марта 2012

Во-первых, понимание того, как 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

По сути, вместо того, чтобы запускать код, который блокирует выполнение до тех пор, пока не истечет тайм-аут или не будет возвращен набор результатов, вы будете запрашивать доступ, чтобы запустить код за кулисами.Затем вы настроите событие, которое будет срабатывать, когда что-то произойдет, например, когда пользователь узнает, что истекло время ожидания (сбой тайм-аута), заполнит сетку результатами (успех) и т. Д.)

...