MS Access で SQL パススルー クエリを使用する場合、デフォルトのタイムアウトは 60 秒です。この時点で、要求をキャンセルする命令がリモート サーバーに送信されます。アクセス独自の「Ctrl + Break」操作と同様に、キーボードからこのコマンドを送信する方法はありますか?
1 に答える
まず、Control-Cが実行をキャンセルする方法を理解します。彼らはおそらくそのキーシーケンスをトラップし、何か特別なことをします。オラクルのクライアントアプリ(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---
ちなみに、Pass-Throughタイムアウトを超えても、Accessはあきらめており、キャンセルコマンドを送信していないと私は信じています。このkbの記事を見ると、ODBCドライバーはクエリタイムアウトさえサポートしていません。
PRB:接続タイムアウトとクエリタイムアウトは、MicrosoftOracleODBCドライバーとOLEDBプロバイダーではサポートされていません
経過時間が経過すると、Accessはおそらく結果のリッスンを停止します。まだ実行中のクエリのリストをoracleに要求した場合、リストされたクエリがまだ表示されていると強く思います。
---編集#2---
独自の「キャンセル」を実装する限り、これは実際にはキャンセルではありませんが、「クエリの状態に関係なくUIの応答性を維持する」という点で、ここでのキーワードは非同期になります。UIのメッセージポンプをブロックしないように、非同期で実行するようにコードを書き直したいとします。「非同期クエリアクセス」を探し始めて、何が表示されるかを確認します。1つのSO結果が出ました:
xtremevbtalk.comでのまともな出発点と同様に:
http://www.xtremevbtalk.com/showthread.php?t=82631
実際には、タイムアウトが発生するか結果セットが返されるまで実行をブロックするコードを起動する代わりに、バックグラウンドでコードを開始するためのアクセスを要求します。次に、タイムアウトが発生したこと(タイムアウトの失敗)、グリッドへの結果の入力(成功)など、さらに何かが発生したときに発生するイベントを設定します...)