Laden...

Geschwindigkeitsproblem DataTable.DefaultView.ToTable bei grosser Zeilen anzahl

9 Antworten
1,633 Aufrufe
Letzter Beitrag: vor 12 Jahren
Geschwindigkeitsproblem DataTable.DefaultView.ToTable bei grosser Zeilen anzahl

verwendetes Datenbanksystem: <SQL Compact 4.0>

Hallo,

Ich erstelle aus einer Datei ein DatatTable und binde dieses an mehrere ComboBoxen.

Für jede ComboBox muss das Datatable Distinct für eine bestimmte Zeile erstellt werden.

Dies passiert mit der Anweisung

datatable.DefaultView.ToTable(true,"spaltenname");

Dies funktioniert für Datatable mit Zeilen anzahl unter 10000 sehr gut.
Alles was darüber liegt dauert (sehr) lange, da jedesmal die Tabelle neu erstellt werden muss.

Hab das anbinden der Datasource schon mit der Invoke funktion versucht. Das macht das ganz etwas schneller.


protected delegate void updateDataSourceDelegate(DataTable table);


 internal void dataSourceSingle(DataTable table)
 {
 updateDataSourceDelegate xxx = new updateDataSourceDelegate(updateMe);
  this.Invoke(xxx, new object[] { table });
}


     private void updateMe(DataTable table)
        {
         
            this.DataSource = table.DefaultView.ToTable(true, this.SpaltenKopf);
            this.DisplayMember = this.SpaltenKopf;
            this.ValueMember = this.SpaltenKopf;
            this.Update();
        }



Wenn jemand eine Idee hat was ich verbessern oder ändern könnte bzw. ein besser Lösung kennt wäre ich sehr dankbar.

Viele Grüße

telly

Wozu meinst du das ToTable benutzen zu müssen?
Hierbei werden alle Datenätze neu erstellt ( gecloned ) und die verbrauchen dann
natürlich doppelt und dreifach Speicher.

Fürs normale DataBinding benötigst du das nicht.

Auch habe ich hier schon gefühlte 1000 mal erklärt, das ValueMember und DisplayMember vor dem setzend er DataSource zu machen sind, denn sonst wird das Binden wie in deinem Fall 3 Mal durchgeführt.

Auch ist dein code eher davon geprägt irgendwas ausprobiert zu haben statt zu wissen was Du da tust.

Warum benutzt du z.b. Invoke?
Werden die Daten in einem Extra Thread geladen?

Hallo,
danke für die schnelle antwort.

Leider verfolge ich deine Post nicht also kann ich nicht sagen wie oft du das geschrieben hast.
Ich wusste es nicht und hab es jetzt geändert.

Ich brauche eine Distincte abfrage der Spalte

[URL= http://msdn.microsoft.com/de-de/library/wec2b2e6%28v=vs.110%29.aspx]DefaultView.ToTable[/url]

und ja das was du siehst ist Test-Code und ja ich probiere aus.

Viele Grüße

Telly

Aber ausprobieren ohne Wissen macht das finden der Lösung nicht einfach.

Hast du denn mal geschaut, was hier der langsame part ist?
Ist es das Erzeugen der DataTable aus dem View?
Ist es das zuweisen der DataTable?
Sind es die weiteren Anweisungen?
Du probierst das auch ohne Debugger?

Hallo,
die langsam Answeisung liegt hier :


this.DataSource = table.DefaultView.ToTable(true, this.SpaltenKopf);

Das genaue Problem liegt hier :


table.DefaultView.ToTable(true, this.SpaltenKopf);

Alles mit dem Debugger getestet.

Viele Grüße
telly

Das genaue Problem liegt hier :

  
table.DefaultView.ToTable(true, this.SpaltenKopf);  
  

Hast du das explizit ohne Zuweisung zum DataGridView getestet? Um wie viele Datensätze handelt es sich?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

Es handelt sich um 17531 Datensätze.

Es gibt kein datagridView es gibt nur eine ComboBox mit Anbindugn an ein DataTable

Viele Grüße

telly

Es könnte einfach daran liegen das Du die falsche Stelle fürs Distinct benutzt.

Die DataTable ist zwar eine im Speicher befindliche Representation der Daten, aber keine DB Engine.
Es wird ( ohne indizes usw ) bei der Datenmenge millionen Vergleiche machen müssen.

Wenn du aber die Spalte indizierst und die Arbeit der DB ( die extra für sowas gedacht ist ) benutzt, wird sich die Zeit verringern.

Hallo,

ok sowas hab ich mir was gedacht.

Danke für die hilfe

Viele Grüße

telly