Обход ошибки ADO 3711: «Невозможно выполнить операцию при асинхронном выполнении» - PullRequest
2 голосов
/ 02 февраля 2012

Я использую объект TADOConnection в Delphi XE, но это проблема ADO, а не проблема Delphi:

Сценарий: Я пытаюсьзакройте и освободите объект TADOConnection, подключенный к Sybase.Соединение ожидает ответа от удаленного сервера Sybase после отправки долго выполняющегося запроса в Sybase - тем временем пользователь решил, что ответ занимает слишком много времени, и хочет прервать процесс.

Проблема: При попытке закрыть или освободить объект ADOConnection, когда он ожидает ответа Sybase, я получаю следующее сообщение об ошибке:

"Невозможно выполнить операцию при асинхронном выполнении" и мои звонки на закрытие / бесплатный сбой.Таким образом, при прерывании процесса я всегда получаю утечку и потерянное соединение - в моем случае это не конец света, но и нежелательно.

Это сообщение соответствует ошибке ADO 3711-adErrStillExecuting - Операция не может быть выполнена при асинхронном выполнении.

См. http://msdn.microsoft.com/en-us/library/windows/desktop/ms681549%28v=vs.85%29.aspx

Вопрос: Как изменить состояние объекта ADOConnectionтак что он больше не ждет ответа Sybase, что должно позволить мне вызвать TADOConnection.close и TADOConnection.free.

У меня есть доступ к самому ADOConnection через оболочку Delphi TADOConnection, поэтому я могу использовать все, что доступно в ADO TLB, для достижения этой цели.

Примечание. Я не дал явных указаний ADO выполнитьасинхронная операция - я предполагаю, что это значение по умолчанию в контексте, в котором я работаю (поток создается в ответе приложения TISAPI).Несмотря на это, я предполагаю, что если бы блокировка вызова ADO была бы еще сложнее прервать.

1 Ответ

3 голосов
/ 02 февраля 2012

посмотрите на этот ответ .

В частности, часть DataSet.Recordset.Cancel;.Прежде чем закрыть соединение, вам необходимо сначала отменить запрос.

...