ストアドプロシジャを非同期に実行する (ADO)

 Delphiの ADO Express を使って、ストアドプロシジャを非同期実行する方法です。ここではデータベースに SQL Server 2000 を使います。

 まず、ADOのコンポーネントから ADOCommand を選びフォームに置きます。ADOStoredProcでもいいんですが、後で ADOCommand のプロパティ (CommandObjectプロパティ) を使うので ADOCommand の方を使います。

 ADOCommandでも、ADOStoredProcでも、非同期実行するには ExecuteOptions プロパティに、"eoAsyncExecute" を設定します。これで、非同期実行ができます。処理中は States プロパティstExecuting がセットされます(このプロパティは集合型です)。処理が終わると、ADOConnection で、OnExecuteCompleteイベントが発生します。

 実行ボタンを押すと、ストアドプロシジャを非同期に実行する。処理中にキャンセルボタンを押されたら処理を中止するようにします。

■ 非同期実行の例
//----------------------------------------------------------
//  実行ボタン
//----------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  //非同期に実行するための準備
  ADOCommand1.ExecuteOptions  :=  [eoAsyncExecute];
  //実行するストアドプロシジャ
  ADOCommand1.CommandText     :=  'Execute  dbo.Exec日次処理  20030901';
  //ストアドプロシジャの実行
  ADOCommand1.Execute;
  //終わるまで実行ボタンは押せないようにする
  Button1.Enabled :=  False;
end;

//----------------------------------------------------------
//  実行終了のイベント
//----------------------------------------------------------
procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
  RecordsAffected: Integer; const Error: Error;
  var EventStatus: TEventStatus; const Command: _Command;
  const Recordset: _Recordset);
begin
  //実行が終わるとADOConnectionの ExecuteCompleteイベントが発生する
  if  (Command = ADOCommand1.CommandObject) then  begin
    //実行ボタンを押せるようにする
    Button1.Enabled :=  True;
  end;
end;

//----------------------------------------------------------
//  中止ボタン
//----------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
begin
  //実行中かどうかの判定
  if  (stExecuting in ADOCommand1.States) then  begin
     if  (MessageDlg('中止しますか?', mtWarning, [mbYes, mbNo], 0) = mrYes)  then
     begin
      //実行を中断する
      ADOCommand1.Cancel;
     end;
  end;
end;