解决ADO错误3711:“异步执行时无法执行操作”

时间:2012-02-02 15:50:59

标签: delphi ado adoconnection

我在Delphi XE中使用TADOConnection对象,但这似乎是一个ADO问题,而不是Delphi问题:

场景:我正在尝试关闭并释放连接到Sybase的TADOConnection对象。在向Sybase发送长时间运行的查询后,连接正在等待来自远程Sybase服务器的响应 - 在此期间,用户认为响应时间过长并且想要中止该过程。

问题:在等待Sybase响应时尝试关闭或释放ADOConnection对象时,收到以下错误消息:

“异步执行时无法执行操作”,我的关闭/免费调用失败。因此,在中止流程时,我总是以泄漏和孤儿连接结束 - 在我的情况下不是世界末日,但也不可取。

此消息对应于 ADO错误3711-adErrStillExecuting - 异步执行时无法执行操作。

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

问题:如何更改ADOConnection对象的状态,使其不再等待Sybase响应,这应该允许我调用TADOConnection.close和TADOConnection.free。

我可以通过Delphi TADOConnection包装器访问ADOConnection本身,这样我就可以使用ADO TLB中的任何可用来完成此任务。

注意 - 我没有明确指示ADO执行异步操作 - 我假设这是我正在运行的上下文中的默认值(在TISAPI应用程序响应中生成的线程)。无论如何,我认为如果ADO呼叫被阻止,则中止将更加困难。

1 个答案:

答案 0 :(得分:3)

看看这个response

特别是DataSet.Recordset.Cancel;部分。 在关闭连接之前,需要先取消查询。