Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Progressbar beim Füllen eines Dataadapters


CHLINDE - Mi 24.09.08 19:11
Titel: Progressbar beim Füllen eines Dataadapters

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
private bool DataGridFuellen(string strDatenbankPfad, string strTabellenName)
        {
            try
            {
                OleDbConnection Datenbankverbindung = DatenbankVerbindungOeffnen(strDatenbankPfad);

                OleDbCommand Befehl = new OleDbCommand();
                OleDbDataAdapter DatenAdapter = new OleDbDataAdapter(Befehl);
                DataTable Tabelle = new DataTable();

                Befehl.CommandText = "SELECT * FROM " + treeView_Tabellen.SelectedNode.Text;
                Befehl.Connection = Datenbankverbindung;
                Tabelle.Locale = System.Globalization.CultureInfo.InvariantCulture;
                DatenAdapter.Fill(Tabelle);

                dataGridView_TabellenInhalt.DataSource = Tabelle;

                Datenbankverbindung.Close();
                return true;
            }
            catch (Exception E)
            {
                MessageBox.Show("Beim Füllen des DataGrid ist ein Fehler aufgetreten: " + E.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }


Ich fülle so ein DataGrid aus einer DataTable.
Bei großen Tabellen dauert es sehr lange, bis die Daten im Datagrid verfügbar sind. Wie kann ich die verbleibenede Zeit mithilfe eines Progressbars darstellen?


JüTho - Do 25.09.08 08:52

Der beste Rat lautet: vergiss es.

Zunächst müsstest Du die Anzahl der Datensätze abfragen mit SELECT COUNT(*), was eine doppelte Abfrage bedeuten würde. Dann müsste das Lesen in einen eigenen Thread bzw. BackgroundWorker ausgelagert werden, und dort müsste das Ereignis DataTable.RowChanged o.ä. mit PerformStep o.ä. verbunden werden.

Allenfalls könntest Du ProgressBarStyle.Marquee berücksichtigen. Aber das Auslagern in einen BackgroundWorker ist auf jeden Fall sinnvoll.

Gruß Jürgen