MS Access取消执行pass-thru查询键盘快捷方式

时间:2012-01-17 15:01:07

标签: ms-access odbc passthru

在MS Access中使用SQL pass-thru查询时,默认超时为60秒,此时会向远程服务器发送指令以取消请求。无论如何从键盘发送此命令类似于Access'自己的“Ctrl + Break”操作?

1 个答案:

答案 0 :(得分:2)

首先,了解Control-C如何取消执行。他们可能会捕获关键序列,并做一些特别的事情。我强烈怀疑oracle的客户端应用程序(SQL * Plus等)在幕后调用OCIBreak(),并将句柄传递给他们在使用先前的OCI调用执行查询时获得的服务器。

我还怀疑Access在60秒后没有做任何积极的事情;这只是它在执行查询时请求的超时。更重要的是,我开始怀疑Access是否甚至要求超时;我读过的所有内容都说ODBC驱动程序不支持查询超时,这让我觉得它只是一个客户端超时,但我离题了......

所以 - 回到这个OCIBreak()调用。这是坏消息:我不认为ODBC实现了这些调用。要100%确定,您必须查看oracle源代码的ODBC驱动程序,但我读过的所有内容都表明API调用未公开。

作为参考,我一直在谷歌上搜索这些搜索词与“OBDC”:

ORA-01013  (error when a user cancelled an operation, or when an operation times out)
OCIBreak   (OCI function which cancels a pending operation)

---编辑#1 ---

作为旁注,我真的相信Access只是放弃了,并且在超过Pass-Through超时时不发送任何类型的cancel命令。如果您看一下这篇kb文章, ODBC驱动程序甚至不支持查询超时

PRB: Connection Timeout and Query Timeout Not Supported with Microsoft Oracle ODBC Driver and OLE DB Provider

经过一段时间后,Access可能会停止侦听结果。如果您要向oracle索取仍在执行的查询列表,我强烈怀疑您仍然会看到列出的查询。

---编辑#2 ---

至于实现你自己的“取消” - 这实际上不是取消,更多的是“无论查询状态如何都保持UI响应” - 这里的关键字将是异步的。您将要重写代码以异步执行,以便它不会阻止UI的消息泵。我开始谷歌搜索“异步查询访问”,看看弹出什么。一个SO结果出现了:

Running asynchronous query in MS Access

以及xtremevbtalk.com的一个不错的起点:

http://www.xtremevbtalk.com/showthread.php?t=82631

实际上,您不会触发阻止执行的代码,直到发生超时或返回结果集,而是要求访问权限启动幕后代码。然后,您将设置一个事件,当事件发生时触发,例如让用户知道超时发生(超时失败),填充结果(成功)等网格......)