2

Delphi XE で TADOConnection オブジェクトを使用していますが、これは Delphi の問題ではなく、ADO の問題のようです。

シナリオ: Sybase に接続されている TADOConnection オブジェクトを閉じて解放しようとしています。接続は、実行時間の長いクエリを Sybase に送信した後、リモート Sybase サーバーからの応答を待っています。その間に、ユーザーは応答に時間がかかりすぎていると判断し、プロセスを中止したいと考えています。

問題: Sybase の応答を待っているときに ADOConnection オブジェクトを閉じるか解放しようとすると、次のエラー メッセージが表示されます。

「非同期実行中は操作を実行できません」と表示され、close/free の呼び出しが失敗します。そのため、プロセスを中止すると、常にリークと孤立した接続が発生します。私の場合、世界の終わりではありませんが、望ましくもありません。

このメッセージは、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 呼び出しがブロックされていた場合、中止するのはさらに困難になると思います。

4

1 に答える 1

3

この応答を見てください。

特にその DataSet.Recordset.Cancel;部分。接続を閉じる前に、まずクエリをキャンセルする必要があります。

于 2012-02-02T16:35:46.563 に答える