TADOQuery でクエリーを実行した時に,その進行 (進捗) 状況を取得する方法のテストをしてみました.
処理をフェッチして,その度に処理経過を取得します.
もしかしたら,コールバック関数等があるのかも知れません.
情報をお待ちしています.
時間のかかる処理として,BACKUP DATABASE というコマンドがあるらしいのですが,知らないし,使ったこともありません.
そこで,単なる SELECT 文で進行状態が取得できるか確認してみました.
SELECT 文なので,一瞬です.そこで,プログレスバーを使わず,ファイルに保存しています.
レコード数が少なくとも 1500 以上はないと,検出は 1 回で終了してしまいます.
使用したコンポーネント類は下図の通りです.
テストに使用したデータベースは,mdb (JET データベース) でレコード数は約 128,000 です.
動作確認は,Windows 7 U64(SP1) + Delphi XE です.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ADODB, Grids, DBGrids, DB, ExtCtrls;
type TForm1 = class(TForm) ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DataSource1: TDataSource; DBGrid1: TDBGrid; procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus); private { Private 宣言 } SL : TStringList; RecordCount : Integer; public { Public 宣言 } end;
var Form1: TForm1;
implementation
{$R *.dfm}
//============================================================================= // フォーム表示開始時にADO関係を設定 //============================================================================= procedure TForm1.FormShow(Sender: TObject); var Str : String; begin SL := TStringList.Create;
ADOConnection1.Connected := False; ADOConnection1.LoginPrompt := False;
//接続文字列の作成(パスワードなしの場合) Str := 'Provider=Microsoft.Jet.OLEDB.4.0'; Str := Str + ';Data Source=' + 'Data\YobinZip.mdb';
ADOConnection1.ConnectionString := Str; ADOConnection1.Mode := cmReadWrite;
ADOQuery1.Connection := ADOConnection1; DataSource1.DataSet := ADOQuery1; DBGrid1.DataSource := DataSource1;
//処理対象のレコード数を取得しておく //そうしないと処理の進行結果をパーセントで取得できないので ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT * FROM 住所 '); ADOQuery1.Open; RecordCount := ADOQuery1.RecordCount; ADOQuery1.Close;
//フェッチの設定 ADOQuery1.CursorLocation := clUseClient; ADOQuery1.ExecuteOptions := [eoAsyncFetchNonBlocking];
//これ以降に実際に時間のかかる処理コードを書く ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT * FROM 住所 '); ADOQuery1.Open; end;
//============================================================================= // 終了時には切断処理 //============================================================================= procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin SL.SaveToFile('AAAA.txt'); FreeAndNil(SL);
ADOConnection1.Connected := False; end;
//============================================================================= // ADOQuery1のOnFetchProgressイベント // MaxProgress フェッチレコード数(処理済みレコード + フェッチレコードサイズ) // Progress 処理すみレコード数 // フェッチレコードのサイズは,デフォルトでは15 //============================================================================= procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus); begin if EventStatus = esOK then begin // Progress / RecordCount で処理済みの割合が取得できる SL.Add(FormatFloat('##0.00', Progress / RecordCount * 100)); end; end;
end.
参考リンク
[Data.Win.ADODB.TCustomADODataSet.OnFetchProgress]
http://docwiki.embarcadero.com/Libraries/XE3/ja/Data.Win.ADODB.TCustomADODataSet.OnFetchProgress
[FetchComplete イベント、ADO FetchProgress を使用するには、方法]
http://support.microsoft.com/kb/262311/ja
[FetchProgress イベント (ADO)]
http://msdn.microsoft.com/ja-jp/library/jj248828.aspx
|