Announcement

Collapse
No announcement yet.

Daten laden mit Fortschrittsanzeige

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten laden mit Fortschrittsanzeige

    Hallo,
    ich habe folgendes Problem mit TADODataSet:

    Ich moechte den User waehrend des Ladevorgangs nicht mit einer einfachen Sanduhr sitzenlassen, daher habe ich folgendes versucht:

    Ich habe ich bei der ADOConnection ConnectionOptions auf coAsyncConnect gesetzt und am ADODataSet folgende Eigenschaften eingestellt:
    CursorLocation:=clUseClient
    ExecuteOptions:=[eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking]

    Da mir weder AfterOpen, noch OnFetchComplete immer korrekt ausgelöst werden, wenn die Abfrage keine Daten enthält, habe ich mit folgender Schleife geprüft, ob die Abfrage ausgeführt wurde:

    var
    b=boolean;
    begin
    b:=false;
    while not b do
    if Assigned(ADODataSet1.Recordset) then
    b:=(ADODataSet1.Recordset.State=1);
    end;

    Leider spielt jedoch das Grid, welches ich an das ADODataset gehaengt habe, verrueckt und zeigt manchmal nur den ersten Datensatz an. Manchmal zeigt es aber auch nur eine (leere) Spalte an, dies aber für alle Datensätze.

    Wie kann ich nun mein Statusfenster anzeigen ohne diese Probleme zu haben? Das Ereignis OnFetchProgress hat ja auch seine Fehler (die aber meiner Ansicht nach von ADO kommen, da ein VB-Entwickler die gleichen Probleme mit diesem Ereignis hat).

    MfG Jan

  • #2
    Hallo,

    ich habe das zwar noch nicht ausprobiert, aber der Beschreibung im <b>MDAC 2.5 SDK</b> nach sollte ein Aufruf des letzten Datensatzes (MoveLast) der Datenmenge erst dann zurückkehren, wenn alle Daten geladen wurde. Damit geht jedoch der Vorteil des nichtblockierenden primären Threads verloren - so das ich diesen Aufruf erst dann machen würde, wenn sichergestellt werden soll, das alle Daten "an Bord" sind.

    P.S: An Stelle einer Schleife, die den primären Thread "einfriert", würde ich über einen Timer nachprüfen, ob State noch auf <b>adStateFetching</b> (8) gesetzt ist. Wenn nicht, wird der Timer deaktiviert, da alle Daten geladen wurden

    Comment


    • #3
      Hallo,
      ich habe nach einigem rumprobieren herausgefunde, dass man die eigenschaft Dataset der TDataSource-Komponente erst nach dem kompletten Fetchzyklus zuweisen darf. Dann klappt es auch mit dem Grid. Das mit adStateFetching kann ich ja zusätzlich noch umsetzen.

      Meine bisherige Lösung sieht ungefähr so aus:
      <pre>
      var
      b:boolean;
      begin
      DataSource1.DataSet=nil;
      ADODataSet1.Close;
      ADODataSet1.Open;
      b := false;
      while not b do
      begin
      if Assigned(ADODataSet1.Recordset) then
      b := (ADODataSet1.Recordset.State = 1)
      Application.ProcessMessages;
      end;
      end;
      </pre>

      MfG Ja

      Comment

      Working...
      X