| |
ADO.NET / DatenbankenAnzeige größerer Datenmenge ist sehr langsam | | | Autor: JuppG | Datum: 25.03.16 16:22 |
| Hallo zusammen,
Ich möchte ein VB6-Projekt auf vb 2013 umstellen.
Im Prinzip klappt das ganz gut, aber ich habe ein schweres Problem mit dem Datenzugriff. Die von mir geschriebene Routine ist einfach zu lahm.
Die Aufgabe:
Anzeige eines Formulars mit zwei Dattagridviews und einem Einzelsatz.
Es sollen alle Kunden mit Rapporten (Aufträgen), die einen bestimmten Status (oder auch mehrere) haben, in einem Datagridview angezeigt werden.
Dann sollen sofort die Aufträge des Kunden aus der ersten Zeile des Datagridviews mit dem vorgegebenen Status in dem zweiten Datagridview angezeigt werden.
In der Einzelanzeige soll dann sofort die Anlage (Gerät), falls im Auftrag vorhanden, angezeigt werden.
Vorgabe des Kunden sind sowohl dieser Ablauf als auch die Verwendung einer Access-Datenbank.
Der Connection-String verweist auf eine Access-Datenbank auf einem Server.
Die eigentliche Lesen ist in eine Funktion ausgelagert.
Fehlerbehandlung und andere Zwischenschritte habe ich weggelassen, um das Wesentliche zu zeigen.
Mengengerüst:
Kunden ca. 5.000 - 6.000
Papporte ca. 30.000
Anlagen ca. 15.000 (nicht jeder Auftrag betrifft eine Anlage)
Unter VB6 wird das Formular innerhalb weniger als einer Sekunde komplett angezeigt, in der neuen Version benötigt es mehr als 10 Sekunden und ist nicht akzeptabel für den Kunden.
Da ich sicher bin, dass es an meiner Programmierung liegt, hier der Source Code:
Dim zDTR As New DataTable, zDTK As New DataTable, zSel As String
Erster Schritt: Lesen der Kunden mit einem bestimmten Status ind das erste Datagridview (im Debugger Verzögerung mittel):
zSel = "SELECT DISTINCT Kunde.KDNr, Feld2, ..., Feldn, Rapport.Status " & _
"FROM Kunde INNER JOIN Rapport ON Kunde.KdNr = Rapport.KdNr WHERE (Rapport.Status = 'A" OR Rapport.Status = 'D') "
zDTK = LeseDaten(zSel, Allg_Connstr, Allg_DBArt)
Me.DataGridView1.DataSource = zDTK
Me.DataGridView1.Rows(0).Selected = True
Zweiter Schritt: Lesen der Rapporte des Kunden mit dem vorgegebenen Status ind das zweite Datagridview (im Debugger Verzögerung hoch):
zSel = "SELECT RapportNr, Feld2, ..., Feldn " & _
"FROM KundenRapporteAbfrage " & _
"WHERE KdNr = " & Me.DataGridView1.Rows(0).Cells(0).Value & " AND (Status = 'A" OR Status = 'D') "
zDTR = LeseDaten(zSel, Allg_Connstr, Allg_DBArt)
Me.DataGridView2.DataSource = zDTR
Me.DataGridView2.Rows(0).Selected = True
Dritter Schritt: Lesen der einzelnen Anlage, falls vorhanden (Diesen Schritt zeige ich der Vollständigkeit halber, im Debugger läuft er ohne Verzögerung:
FuelleRapport
Private Sub Fuelle_Rapport()
Dim zSel As String, zRapportNr As Integer, zDT As DataTable
zRapportNr = Me.DataGridView2.SelectedRows(0).Cells(0).Value
zSel = "SELECT * " & _
"FROM Kunden_Rapporte_Abfrage " & _
"WHERE RapportNr = " & zRapportNr & " "
zDT = LeseDaten(zSel, Allg_Connstr, Allg_DBArt)
If zDT.Rows.Count > 0 Then
Me.RapportNr.Text = zDT.Rows(0).Item("RapportNr")
Me.Feld2.Text = zDT.Rows(0).Item("Feld2")
...
Me.Feldn.Text = zDT.Rows(0).Item("Feldn")
End If
End Sub
Private Shared Function LeseDaten(ByVal zSelStr As String, ByVal zConnStr As String) As DataTable
On Error GoTo ErrProz
Dim Conn1 As New OleDbConnection(zConnStr)
Dim zDA As New OleDbDataAdapter(zSelStr, Conn1)
Dim zDT As New DataTable()
Conn1.Open()
zDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
zDA.Fill(zDT)
Conn1.Close()
Return zDT
End Function | |
Re: Anzeige größerer Datenmenge ist sehr langsam | | | Autor: Manfred X | Datum: 25.03.16 17:21 |
| Hallo!
Du könntest beim Lesen (Select-Command) mit ADO.Net z.B. Parameter
verwenden. In das SQL-Select-Kommando gehören keine Control-Zugriffe;
Filter-Werte für die SQLParameter sind ggf. der Datatable zu entnehmen.
(Evt. beide Tabellen in einer Dataset-Abfrage füllen.)
Allgemeine Optimierungshinweise (Datarelation etc):
https://msdn.microsoft.com/de-de/library/ms810293.aspx
((Für die Datenbindung könntest Du Bindingsource-Instanzen zwischen
Table und Control schalten. Die Textboxen solltest Du an diese
Bindingsourcen binden.))
Ich denke aber, das Problem besteht darin, daß bei ADO.Net
alle Datensätze, die die Select-Bedingungen erfüllen, "en bloc" in den
Speicher geladen werden. Eventuell die Abfrage in mehrere Selects
aufgliedern - durch Einführung zusätzlicher Bedingungen.
Am besten aber:
Überzeuge Deinen Kunden, eine "richtige" Datenbank zu verwenden.
Schau Dir auch die Visual Studio Tools für Office an.
Oder bleibe bei VB6 und ADO Classic (evt. VB.Net und ADO-Classic).
Oder erstelle geeignete Office-Formulare.
Beitrag wurde zuletzt am 25.03.16 um 17:31:57 editiert. | |
Re: Anzeige größerer Datenmenge ist sehr langsam | | | Autor: JuppG | Datum: 11.04.16 15:16 |
| Hallo Manfred X,
vielen Dank für Deine schnelle Reaktion und bitte entschuldige die lange Antwortzeit.
Nach etlichen Versuchen bin ich mit meinem Kunden übereingekommen, den SQL-Server zu verwenden. Damit erfolgt bei gleicher Programmierung die Anzeige der Daten sofort.
Da aber bei dem Füllen des zweiten Datagrids manchmal nur ein Datensatz angezeigt wird, habe ich bei der Access-Lösung den Verdacht, dass ADO.net die Indizes der Access-Tabelle ignoriert und über die ganze Datenbank läuft. Ist da irgendetwas bekannt?
Viele Grüße
Jupp | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|