Autor Beitrag
DonJesus
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 06.04.09 11:20 
Hallo,

ich bastel grad an einem kleinen einfachen Konsolenscript. Ich lese Daten aus einer Firebird Datenbank aus und schreibe sie in eine .csv Datei. Die Datenmenge ist leider etwas größer. Pro Tag wird der View auf den ich in der DB zugreife um etwa 2000 Einträge länger.

Nun möchte ich, damit man auch sieht wo das Script in etwa ist, wenigstens die Anzahl der abgefragten Zeilen in der Konsolenbox anzeigen. z.B. "Bearbeite Zeile 666 von 1989" Oder "66,6% abgeschlossen."

Ich könnte zwei Abfragen einbauen... einmal den count und einmal die eigentliche Abfrage. Da die 2000 Zeilen aber kontinuierlich eingefügt werden, gibt es regelmässig Abweichungen, weil mehr Zeilen ausgelesen werden als ursprünglich berechnet.

Irgendwann (viel viel später) soll es dann mal ne ordentliche Anwendung werden bei der ein Fortschrittsbalken angezeigt wird. Dafür muss ich ja auch während der Laufzeit der Anwendung die 100% schon berechnet haben.

Kann mir jemand sagen, wie ich die 100% am schlausten anzeigen/berechnen kann? Besten Dnak schon mal.


Gruß
DonJay


Wenn falscher Forenteil bitte verschieben. Wenn ich falsche Suchbegriffe verwendet habe um eine Lösung zu finden, bitte einfach nen Link posten. Für beide Fälle gilt: großes mea culpa und Asche auf mein Haupt.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 06.04.09 11:34 
Hallo und :welcome:

Zunächst zum Forum: Nach meiner Einschätzung passen Fragen zur ProgressBar eher nach Windows Forms, auch wenn es sich um die Anzeige während einer Datenbank-Verarbeitung handelt. Bei der Fortschrittsanzeige in einer Konsolenanwendung ginge es eher in Richtung Basistechnologien. Aber das ist in der Tat ein Grenzfall.

Zum eigentlichen Problem: Bei einer DB-Abfrage wirst du kaum eine vernünftige Fortschrittsanzeige bekommen. Du schreibst nicht einmal, wie du es ausführst: mit DbDataAdapter und DataSet/DataTable oder mit DbDataReader?
Das Abrufen der Daten geht immer "am Stück", erst nach Erledigung ist die Anzahl der Datensätze bekannt. Selbst bei DbDataReader.RowsAffected heißt es:
SDK-Doku/MSDN hat folgendes geschrieben:
Die RecordsAffected-Eigenschaft wird erst festgelegt, wenn alle Zeilen gelesen wurden und Sie den SqlDataReader schließen.

Am ehesten geht es, wenn die Daten zunächst in eine DataTable eingelesen werden; dann kennst du Rows.Count und kannst für den zweiten Schritt, den Datenexport, die Anzeige einbauen.

So eine Aufgabe ist sowieso etwas für einen separaten Thread bzw. BackgroundWorker. Auch deshalb empfehle ich, es von vornherein als WinForms- bzw. WPF-Anwendung zu erstellen.

Gruß Jürgen
DonJesus Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 06.04.09 13:06 
Vielen Dank für die nette Begrüßung und die prompte Antwort.

Ich nutze den FbDataReader um die Daten auszulesen und den StreamWriter um die Daten in die Datei zu schreiben.

Die DataTable Klase werd ich mir mal zu gemüte führen. Solange es nicht genauso lange dauert die Daten dort bereitzustellen nur um sie zu zählen, wäre das eine Option.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 06.04.09 13:27 
Wenn es vor allem um die Geschwindigkeit geht, ist der DbDataReader eigentlich immer das schnellste Verfahren, weil er Zeile für Zeile verarbeitet und er immer nur eine einzelne Zeile betrachten muss. Erst wenn weitere Anforderungen hinzukommen, vor allem die Verarbeitung von Daten in der GUI oder eine ProgressBar, ist DataSet/DataTable viel besser geeignet. Jürgen