Einfluss auf Fill-Methode
-
Hallo zusammen
Kann mir jemand sagen, wie man Einfluss auf die Fill-Methode hat?
Mein (programmier) Problem:
Ich möchte den genauen Status beim Füllen eines DataSets via ProgressBar ausgeben.
Ist es möglich, mit einem Reader (XML, Binary oder sogar Stream) den Zustand
der ProgressBar zu verändern?Danke schon im Vorraus für mögliche Varianten...
Grüsse
-
Ein DataSet ist doch eine Sammlung von Tabellen, wenn ich mich nicht täusche. Was willst du also machen? Tabellen dem DataSet zuweisen oder Tabellen im DataSet füllen?
Wenn du bspw. eine Tabelle aus dem Set füllen willst und die Daten dafür aus einem Stream beziehst, dann würde ich versuchen, die Länge des Streams als 100% zu setzen und dann jeweils die aktuelle Position im Stream in Prozent umzurechnen und anzuzeigen.
Also die Maximum-Eigenschaft der ProgressBar auf die Streamlänge festsetzen und die Value-Eigenschaft mit der aktuellen Position im Stream belegen.Welche Fill-Methode meinst du?
-
Danke für Deine Antwort.
Fill->(ds, "Tabelle1")
Wie konfiguriere ich den StreamReader?
-
Mit welchen der beiden muss ich miteinbeziehen?
for(int...
oder while
case...
-
Weder das DataSet noch die ProgressBar hat eine Fill-Methode. Woher holst du sie oder hast du sie selbst geschrieben?
Für StreamReader nehme ich immer eine while-Schleife
StreamReader^ sr = gcnew StreamReader(S"TestFile.txt"); String^ line; // Read and display lines from the file until the end of // the file is reached. while (line = sr->ReadLine()) { Console::WriteLine(line);}
-
Peakende? Was meinst Du mit Peakende?
-
Danke für diese Lösung.
Wie sieht das mit "Adapter->Fill(ds, "Tabelle1")" aus?
Danke und Gruss
-
Peakende bezeichnet das Ende eines Streams.
Du nimmst also die Fill-Methode von DataAdapter. Wie jetzt der genaue Ablauf ist, kann ich nicht sagen, aber ich vermute, dass etwas ähnliches abläuft, wie die Zuweisung einer Tabelle der DataSource-Eigenschaft des DataSets. Glaub nicht, dass du damit das ProgressBar nutzen kannst, weil es nur die Änderung einer Eigenschaft ist und nichts wo du Anfang und Ende finden kannst.
-
Fill nimmt ein Objekt mit der Schnitstelle IDataReader entgegen. Der DataReader selbst kennt wiederum die Methode NextResult .
Du könntest mal versuchen, ob es Dir etwas bringt, von dem für Deine Zwecke verwendeten Reader zu erben und die Methode NextResult zu verwenden. (Vergiss nicht die NextResult der Basisklasse aufzufrufen).
http://msdn2.microsoft.com/de-de/library/system.data.datatablereader.nextresult(VS.80).aspx
Etwas wage der Ansatz, aber vllt. hilft Dir die Richtung ein wenig weiter.
Btw.: Wieviel Datensätzen hast Du denn zum lesen ?
-
Guten Morgen allerseits
Die Anzahl an Datensätze ist verschieden. Es ist aber mindestens eine DataTable->Row die ich einlesen möchte; es können aber auch mehrere 100 Rows sein...
Bin ich dann von der Anzahl Datensätze zum lesen mit dem IDataReader an eine gewisse Anzahl Datensatz->Lenght gebunden?
Gibt der IDataReader nicht Text zurück? Das müsste ich doch unterbinden, denn ich bräuchte ihn ja nur um mehr oder weniger genau feststellen zu können, wo der Reader in jedem Moment gerade liest... Ich versuche es mal, auf diese Variante.
Gruss
P.S. Mal schauen ob ich das alleine hinkriege...
-
Hab den DataReader nie explizit benutzt. Ne andere Frage wäre, ob sich der AUfwand lohnt. wenige 100 Datensätze können durchaus so schnell eingelesen sein, das man eigentlich nur nen Balken "ploppen" sieht ;o)
-
[doppelpost]
-
Knuddlbaer schrieb:
Hab den DataReader nie explizit benutzt. Ne andere Frage wäre, ob sich der AUfwand lohnt. wenige 100 Datensätze können durchaus so schnell eingelesen sein, das man eigentlich nur nen Balken "ploppen" sieht ;o)
Ja, bis auf eine Tabelle. Die weist jetzt schon 128MB auf...
Mein Wunsch ist es, auch den Ladevortschritt sehen zu können...
-
Eventuell hilft Dir das hier noch weiter:
-
Guten Morgen/Tag zusammen
Knuddlbaer schrieb:
Fill nimmt ein Objekt mit der Schnitstelle IDataReader entgegen. Der DataReader selbst kennt wiederum die Methode NextResult .
Du könntest mal versuchen, ob es Dir etwas bringt, von dem für Deine Zwecke verwendeten Reader zu erben und die Methode NextResult zu verwenden. (Vergiss nicht die NextResult der Basisklasse aufzufrufen).
http://msdn2.microsoft.com/de-de/library/system.data.datatablereader.nextresult(VS.80).aspx
Etwas wage der Ansatz, aber vllt. hilft Dir die Richtung ein wenig weiter.
Btw.: Wieviel Datensätzen hast Du denn zum lesen ?
Wie kann ich jetzt meine Progressbar miteinbeziehen?
Mein Code
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { conn->Open(); this->SelectCommand->ExecuteReader(); DataTable ^ dt = gcnew DataTable("Tabelle1"); DataTableReader ^ dr = gcnew DataTableReader(dt); if (dr->HasRows) { dt->Load(dr); dr->Read(); dr->NextResult(); } while(dr->Read()) { dr->GetString(1); } dr->Close(); conn->Close(); }
Freue mich natürlich wiedermal für Eure Hilfe...
Grüsse
-
Ich habe eine Lösung, die zwar noch nicht dem Entspricht, wie es eigentlich nach meinen Wünschen funktionieren muss.
DataTable ^ dt = gcnew DataTable("Tabelle1"); odda->Fill(dt); // Add table to the DataSet ds1->Tables->Add(dt); // Fill the DataSet odda->Fill(ds1, "Tabelle1"); // Create the DataTableReader (it is disconnected) conn->Open(); OleDbDataReader^ dr = this->SelectCommand->ExecuteReader(); do { while (dr->Read()) { // Get data and do something with it this->progressBar1->Minimum=0; this->progressBar1->Maximum=dt->Rows->Count; this->progressBar1->Step=(dt->Rows->Count)/1000; this->progressBar1->PerformStep(); this->lblRows->Update(); this->lblRows->Text=this->progressBar1->Value.ToString(); } } while (dr->NextResult()); return; if(this->progressBar1->Value >= this->progressBar1->Maximum) { dr->Close(); conn->Close(); this->progressBar1->Value=0; } }
Die ProgressBar soll ja den Ladevortschritt anzeigen...
Danke für eure Hilfe
Grüsse