Dauerhafte Datenbankabfrage mit DGV Aktualisierung

  • VB.NET
  • .NET 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    Dauerhafte Datenbankabfrage mit DGV Aktualisierung

    Hallo Community,

    ich bräuchte einpaar Ratschläge wie ich das Thema angehe.

    Folgendes Szenario:

    Ich habe ein Datagridview das mit Daten zu Kliniken befüllt ist. Zuätzlich soll aus einer Replikationsdatenbank die freien Kontingente der Kliniken ergänzt werden. Ich würde gerne das ganze in Echtzeit im DGV darstellen, da sich die Kontingente den ganzen Tag verändern.

    Da ich ja mit einem Thread oder Backgroundworker arbeiten muss( wo sind zwischen den zwei Alternativen die Unterschiede?) wird wohl dauerhaft eine Connection offen sein?! Bekomm ich dann kein Timeout?

    Welche Methode(Threads oder Backgroundworker) würdet ihr wählen?

    Wie würdet ihr das Thema angehen?


    Liebe Grüße :)
    vorab, ich bin kein experte.

    aber ich würde das datenmodell als dataset abbilden und regelmässig die abfragen laufen lassen um meine einträge zu aktualisieren.
    z.b. mit tableadapter oder so.

    ​das dgv wird ja nicht gefüllt sondern eine Tabelle an die das dgv gebunden ist.
    Gruß Hannes
    Hi,
    ich bin auch kein Experte, stimme da aber @hans im glück zu.
    Ich hab etwas ähnliches für unsere Firma geschrieben, ein Anwesenheitstool für Besucher und ATler.
    Dort frage ich auch einen SQL Server ab und dies alle 2 Minuten.
    Das ganze geht dann so:
    Anwendung startet
    Connection zum Server öffnen, Abfrage schicken, daten in TableAdapter laden, Connection schließen.
    Daten aus Tabnleadapter im DGV anzeigen/aktualisieren
    Das ganze mit einem schnöden Timer, der dies alle 2 Minuten tut.
    Funktioniert sehr gut...
    "Hier könnte Ihre Werbung stehen..."
    Die Fragen, die mir dazu pauschal einfallen:
    1. was heisst in deinem Fall "Echtzeit", innerhalb von Millisekunden? oder Sekunden ? oder Minuten? oder "whatever"
    2. wie groß ist der anzuzeigenden Datenbestand insegsamt? z . B. 10 Datensätze á 10 Byte oder vielleicht 1000000 Datensätze á 1kByte
    3. mit wievielen Änderungen muss man pro Zeit rechnen ?

    Davon hängt das auch ein wenig ab, was für einen Lösungsweg man sinnvoll gehen kann.


    PS: einen Experten würde ich mich auch nicht nennen ;)
    Also die Geschichte mit der Echtzeit ist so eine Sache.
    Hast du Anwender oder geht es wirklich nur um eine reine Anzeige/Darstellung? Ist die Anwendung immer im Vordergrund?
    Von wie vielen Datensätzen reden wir denn hier? (Wäre die 2. Frage von Duke)
    Füllst du irgendeine Datenbank durch deine Anwendung? Wenn ja, könnte man ja noch eine Tabelle in der Datenbank anlegen, mit einer Spalte, die einfach den Datum der letzten Änderung abspeichert. Da müsste man lediglich überprüfen, ob dieser Wert verändert worden ist. Geht natürlich schneller als jedes Mal das komplette DGV upzudaten, obwohl es nichts upzudaten gibt.
    Option Strict On!
    Zu 1.Also Echtzeit bedeutet bei mir eigentlich jede Sekunde. Alle 10 Sek. wäre theoretisch auch in Ordnung.

    Zu 2.Es werden ca. 500 Kliniken aus einer Datenbank angezeigt hinzu kommt dann die Kontingente zu jeder Klinik aus einer Replikationsdatenbank.

    Zu 3. Kann ich nicht genau Beurteilen, es geht darum dass unsere Kundenberater sehen ob in der Klinik noch ein freier Platz vorhanden ist. Deswegen sollten die Datensätze auch ziemlich aktuell Dargestellt werden, um Kunden bestmöglich zu beraten.

    Momentan arbeiten rund 200-300 Mitarbeiter zeitgleich mit der Anwendung. Die Mitarbeiter können auch Informationen zu Kliniken ändern bzw neue anlegen. Außerdem wird über die Anwendung noch Auswertungen gefahren. Hab große Bedenken dass es zu großen Performanceproblemen kommt. Das wäre natürlich so eine Sache....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin12345“ ()

    Ich halte das ständige aktualisieren für sehr 'gefährlich', allerdings weiß ich nicht welcher Server im Hintergrund läuft und wie viel Power dieser hat.
    Es ist am performativsten, wenn du versuchst anhand gewisser Events zu arbeiten. Wenn die Anwendung in den Fokus genommen wird (.Focus) dann würde ich aktualisieren, solange warten bis die form wieder aus dem Fokus genommen wird (.LostFocus) (mit einer flag arbeiten) und irgendwo dem Anwender die Zeit der letzten Aktualisierung einblenden. Zusätzlich sollte der Anwender einen Button haben mit dem er selbst aktualisieren könnte.

    Angenommen ich würde die Anwendung bedienen und scrollen, so würde ja nach 5 Sekunden die DGV geupdatet werden und ich würde wieder auf Position '1' stehen.. Auch nicht ganz so cool- aber ich weiß nicht wie variabel die Daten sind. (Habe jetzt erst gesehen, dass du deinen Post editiert hast)

    Wie gesagt, schau dir mal .Focus und .LostFocus an, dass muss sich nicht nur auf die Form sondern kann sich auf jedes X-Beliebige Control beziehen, und dann würde ich in dem Timer/Thread/Backgroundworker einfach eine Flag einbauen, damit nicht permanent aktualisiert wird während dem Arbeiten mit den Datensätzen.
    Option Strict On!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Drahuverar“ ()

    Von 300 Plätzen pauschal alles alle paar Sekunden pollen halte ich auch für fragwürdig, aber vielleicht eine Kombination:

    Es wird ein Flag gepollt, ob sich was geändert hat (z. B. timestamp der letzten Änderung).
    Wenn veraltet erscheint ein Hinweis, dass die Daten veraltet sind. Der Anwender kann dann per Button die Daten aktualisieren, wenn er grade Bedarf hat.

    Zu 2.Es werden ca. 500 Kliniken aus einer Datenbank angezeigt hinzu kommt dann die Kontingente zu jeder Klinik aus einer Replikationsdatenbank.

    Das wären dann also 500 * (x + y)... sagt mir auch nicht so viel ;)
    Würde die Lösung von @us4711 befürworten. Daten neu laden, wenn sie benötigt werden. Permanentes neu laden sind der totale overload, vor allem bei 200-300 Usern.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen