フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: TADOQuery で処理の進行状況を取得
Mr.XRAY
メンバー
投稿数: 192
TADOQuery で処理の進行状況を取得
on: 2013/06/01 21:46 Sat

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

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.032 sec.