MS Accessは、パススルークエリキーボードショートカットの実行をキャンセルします
質問
MS AccessでSQLパススルークエリを使用する場合、60秒のデフォルトのタイムアウトがあり、その時点で命令がリモートサーバーに送信され、リクエストをキャンセルします。とにかく、アクセス「Ctrl + Break」操作に似たキーボードからこのコマンドを送信することはありますか?
解決
まず、Control-Cが実行をキャンセルする方法を理解します。彼らはおそらくその重要なシーケンスをトラップし、特別なことをします。 Oracleのクライアントアプリ(SQL*Plus et al)が舞台裏でOcibreak()を呼び出しており、以前のOCIコールでクエリを実行したときに取得したサーバーにハンドルを渡していると疑っています。
また、60秒後にアクセスが積極的に何もしていないと思います。これは、実行時に要求するタイムアウトです。さらに、アクセスがそのタイムアウトを要求しているかどうか疑問に思い始めています。私が読んだことはすべて、ODBCドライバーはクエリのタイムアウトをサポートしていないと言います。
だから - このocibreak()呼び出しに戻ります。悪いニュースは次のとおりです。ODBCがこれらの呼び出しを実装しているとは思いません。 100%確信するには、Oracle Sourcesの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 ---
サイドノートとして、私はアクセスがあきらめているだけであり、パススルータイムアウトを超えたときにキャンセルコマンドを送信しないと本当に信じています。このKBの記事をご覧ください。 ODBCドライバーは、クエリタイムアウトさえサポートしていません:
PRB:Microsoft Oracle Oracle ODBCドライバーとOLE DBプロバイダーでサポートされていない接続タイムアウトとクエリタイムアウト
経過時間の後、アクセスはおそらく結果を聞くのを止めます。まだ実行されているクエリのリストをOracleに尋ねると、あなたがまだリストされているのを見ると強く疑われます。
---編集#2 ---
独自の「キャンセル」を実装する限り、これは実際にはキャンセルではなく、「クエリの状態に関係なくUIの応答性を維持する」など、ここでのキーワードは非同期になります。 UIのメッセージポンプをブロックしないように、コードを非同期に実行するように書き換えたいと思うでしょう。 「Async Query Access」のグーグルを始めて、何がポップアップするかを確認します。 1つは結果が出てきました:
xtremevbtalk.comのまともな出発点と同様に:
http://www.xtremevbtalk.com/showthread.php?t=82631
実際には、タイムアウトが発生するか、結果セットが返されるまで実行をブロックするコードを発射する代わりに、舞台裏のコードをキックオフするようにアクセスを求めます。次に、タイムアウトが発生したこと(タイムアウトの障害)が発生したことをユーザーに知らせる、結果を(成功)などに入力するなど、何かがさらに発生したときに発火するイベントを設定します...)