[VB2010 / VS2013] Brauche Hilfe bei performanten Zugriff auf Access2010-Datenbank (.accdb)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von bartio.

    [VB2010 / VS2013] Brauche Hilfe bei performanten Zugriff auf Access2010-Datenbank (.accdb)

    Hallo,

    zur kurzen Vorgeschichte:
    Habe noch mit VB6 Programmiererfahrung gesammelt, nun aber jahrelang nichts mehr groß gemacht. Nun hatte ich für Kollegen eine gutes Excelzeiterfassungsformular gemacht, welches auch gut funktioniert.
    Dies ist aber ohne große Adminfunktion, sondern nur zum selbst eintragen der Zeiten gedacht.
    Nun kam die Frage auf, ob ich das auch nicht mit zentralen Adminfeatures erweitern kann.

    Also installierte ich Visual Studio 2013 und legte los. Ohne große VB.NET Programmiererfahrung und mit viel Internetrecherche ;).
    Nach einigen Tagen hatte ich auch ein ziemlich komplettes Programm (siehe angehängtes Bild).

    Im Grunde funktioniert auch alles (Zeitenspeichern, Saldoberrechnung, Nutzerverwaltung, Adminfunktionen, Alle Eingabeüberprüfungen, Farbcodierungen, Monatsausdruck, usw usw.) und der Handlingstest bei den zukünftigen Admins war auch erfolgreich....bis ich es mit zwei Leuten auf einmal getestet habe.
    Die Datenbank wird auf einem Server liegen (SQL-Server ist im übrigen keine Option :()
    Die Performance bei DB-Zugriffen ist desaströs wenn man mehr als nur ein Nutzer ist, der auf die DB zugreift. Es geht zwar, aber uuunnnnnnnhhheeeimmmmliiiiccchhhhhh langsam (20sekunden Warten auf das Anzeigen von einem Monat) :(

    Deshalb brauche eure fachkundige Hilfe!
    Ich kann mir die Ursache schon denken, möchte aber Expertenrat haben, bevor ich wieder etwas zusammmenfrickle.


    **************************************************************************************************************************************************************************************************************************

    Istzustand:
    ------------
    1) Beim Wechsel des Monats/Users oder Jahres (siehe Bild), lese ich den gesamten Monat aus der DB für die ausgewählten Parameter aus.
    Das mache ich momentan noch mit dem Datareader. Dh ich gehe jede Zeile des Datagrids durch, nehme das Datum in Spalte 0 und lese die entsprechenden Werte aus der DB und schreibe Sie in die entsprechende Zeile. Das mache ich also solange, wie der Monat ist.
    Der Monatssaldo ist übrigens nicht in der DB gespeichert, sondern wird dann beim auslesen gleich berechnet.

    2) Weil ich sehr viele DB-Zugriffe habe, (also jeden Monat bis zu 31 (siehe Punkt 1 obendrüber)) wollte ich die Connection nicht immer disposen und wieder neu aufbauen. Deshalb bleibt Sie dauerhaft offen.

    3) Beim Berechnen des Jahressaldos wird die Aktion von Punkt 1 eben für jeden Monat ausgeführt. Dh. es werden dann ca. 365 Datareader-Anfragen (Zeitspanne vom 01.01. bis eben 31.12.) an die Datenbank gesendet.

    4) Dennoch ist es bei nur einem User als Zugreiffer relativ performant. Nur wenn eben 2 Leute oder mehr angemeldet sind ist es unbrauchbar.


    Analyse:
    ------------
    Denke das die Kombination aus immer offener Connection und den zuvielen DB-Zugriffen durch dummer Programmierung sind das Problem sind. Weiß ich aber nicht 100% wie ich das am besten lösen kann.
    Habe etwas über Datatable und Dataset gelesen und angeschaut. Bin mir aber nicht sicher wie ich das am besten hier einsetze. Wird das überhaupt was bringen?


    Sollzustand:
    ---------------
    Es soll performanter werden. Es muss keine Rakete werden, aber auf alle Fälle soll es schneller sein wenn mehr als nur eine Person darauf zugreift.

    **************************************************************************************************************************************************************************************************************************

    Anhänge:
    - Bild des Programms
    - Modul zum Auslesen des Monats anhand der Parameter

    Wenn ich nochwas hochladen soll, einfach Sagen.


    Schoneinmal Danke
    Bilder
    • hmm.png

      79,24 kB, 600×528, 182 mal angesehen
    Dateien
    eigentlich müsste das Zackzack gehen.
    Also ist wohl iwas mitte Connection faul.

    Ansonsten empfehle ich dir eine ganz andere Vorgehensweise in .Net, als du es gewohnt bist.
    lad dir mal das Tut "Datenbank in 10 Minuten" herunter von erfinderdesrades.unitweb.de/Pr…r/Downloadpage/index.html

    Das wesentliche sind DataAdapter, typisiertes Dataset und Databinding daran.
    Wenn man solch durchgängig einsetzt, könnte man deine Anwendung vmtl. mit 40 Zeilen Code programmieren.

    Allerdings ist auch dein Datenmodell verfehlt - scheinbar hat deine Datenbank gar keine verknüpften Tabellen, und du weißt auch gar nicht, wozu sowas gut ist.
    Hier mal eine Sammlung erforderlicher Grundlagen fürs Datenbanking:
    Datenverarbeitungs-Vorraussetzungen
    Danke für den Input.
    Werde ich wohl nochmal die "Schulbank drücken" müssen und mich mit den Beispielprojekten befassen :D

    Wenn man solch durchgängig einsetzt, könnte man deine Anwendung vmtl. mit 40 Zeilen Code programmieren.

    hmm, schon krass wie man sich die Arbeit unnötig schwer machen kann.

    Andere schreiben das in paar Minuten und ich mache da stundenlang rum :(


    ErfinderDesRades schrieb:


    (...)
    Allerdings ist auch dein Datenmodell verfehlt - scheinbar hat deine Datenbank gar keine verknüpften Tabellen, und du weißt auch gar nicht, wozu sowas gut ist.

    Stimmt nicht ganz. ;)

    Die DB hat zwei Tabellen, User und Zeiten.

    Die sind mit einer simplen 1:n (ein User mehrere Einträge in Zeiten) Verknüpfung versehen.
    Habe ich hauptsächlich wegen der Löschweitergabe gemacht (dh. wird ein User gelöscht werden auch automatisch alle seine Zeiten gelöscht).


    Aber ich gebe dir Recht, auch da ist sicherlich einiges an Optimierungspotenzial vorhanden. Die Normalformen habe ich gekonnt ignoriert :)