Einzelnen Beitrag anzeigen

Norbert5

Registriert seit: 6. Nov 2009
6 Beiträge
 
#1

TADOQuery asynchron abfragen

  Alt 6. Nov 2009, 09:29
Datenbank: MS SQL Server 2005 • Zugriff über: ADO
Ich verbinde eine TADOQuery mit einem DBGrid.
Damit der Benutzer nicht auf das komplette SQL warten muss, arbeite ich asynchron.

Das Grid zeigt aber grundsätzlich den 2. Datensatz als ersten an.
Erst nach einem Next/Prior/Prior komme ich zum 1. Datensatz.
Ebenso positioniert ein First wieder auf Datensatz 2.
Offensichtlich ist BOF true beim 2. Datensatz!

Synchron sind Query und Grid okay.

Hat jemand eine Idee?

Hier mein Code:
[delphi]
type
TForm3 = class(TForm)
PF32DB: TADOConnection;
DataSource1: TDataSource;
OVCDBTable1: TDBGrid;
DBNavigator1: TDBNavigator;
Button1: TButton;
ADOTable1: TADOQuery;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
isexecuting: boolean;
iscanceling: boolean;
aktreccnt: integer;
iworkasync: boolean;
procedure OpenTable;
procedure _onFetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
procedure _onFetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
public
procedure WaitForFirstData;
procedure WaitForAllData;
property Executing: boolean read isexecuting;
public
{ Public-Deklarationen }
end;

var
Form3: TForm3;

const
workasync = true;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
ADOTable1.first;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
PF32DB.Connected := true;
with ADOTable1 do
begin
SQL.Clear;
SQL.Add('Select * from PFPK where tbljahr=2009');
OpenTable;
end;
end;

procedure TForm3.OpenTable;
begin
iworkasync := workasync;
isexecuting := false;
aktreccnt := 0;
with ADOTable1 do
begin
if active then //already opened/closed?
exit;
if not assigned(Connection) then
iworkasync := false;
if (csDesigning in ComponentState) then //no async in Designer
iworkasync := false;
if not iworkasync then
begin
ExecuteOptions := [];
active := true;
exit;
end;
DisableControls;
ExecuteOptions := ExecuteOptions + [eoAsyncExecute, eoAsyncFetch{, eoAsyncFetchNonblocking}];
isexecuting := true;
iscanceling := false;
OnFetchProgress := _OnFetchProgress;
OnFetchComplete := _OnFetchComplete;
aktreccnt := 0;
active := true;
while (isexecuting and (aktreccnt=0))do //wait for first datablock
application.ProcessMessages;
EnableControls;
end;
end;

procedure TForm3.WaitForFirstData;
begin
if (csDesigning in ComponentState) then exit;
while (isexecuting and (aktreccnt=0))do
application.ProcessMessages;
end;

procedure TForm3.WaitForAllData;
begin
if (csDesigning in ComponentState) then exit;
while isexecuting do
application.ProcessMessages;
end;

procedure TForm3._onFetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
if Progress=MaxProgress then
begin
isexecuting := false;
exit;
end;
if (iscanceling and assigned(Dataset) and assigned(Dataset.Recordset)) then
begin
Dataset.Recordset.Cancel;
end;
aktreccnt := Progress;
end;

procedure TForm3._onFetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
begin
isexecuting := false;
iscanceling := false;
end;

end.
  Mit Zitat antworten Zitat