Neue Datenbankeinträge dynamisch feststellen

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Neue Datenbankeinträge dynamisch feststellen

    Hallo,

    ich habe schon häufiger auf Datenbanken zugegriffen, aber bisher immer vollständig den jeweiligen SQL abgegriffen.
    Ich möchte nun nur auf aktuelle Neueinträge reagieren.

    Ich könnte zwar einen Abgleich zwischen Stand Vergangenheit und Stand jetzt machen, aber ich frage mich ob man das eleganter lösen kann. Theoretisch können ja sehr viele Einträge schon vorhanden sein und da habe ich das Gefühl, ich greife dann auf unnötig viel davon zu.

    Eine andere Idee: Mit einem Zeitstempel könnte ich explizit einen SQL erstellen, der dynamisch nur auf zeitnahe Zeiträume begrenzt ist. Das ist vielleicht schon ein guter Ansatz.

    Naja vielleicht gibt es ja auch extra Funktionen genau für sowas. Wollte ich nur in Erfahrung bringen.

    Viele Grüße

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo

    Irgendwie fehlt mit hier eine belastbare Fragestellung.

    Musst der Abgleich denn Multiuserfähig sein. Denn das macht schon einen Unterschied. Der eine User könnte ja den Stand von gestern haben während ein anderer den Stand von vor 5 Minuten hat.
    Also die Fragen: Multiuser, Multimandant, nur neue Datensätze oder auch geänderte?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Haudruferzappeltnoch schrieb:

    nur auf aktuelle Neueinträge reagieren.
    Welche Voraussetzungen muss ein Eintrag denn erfüllen um als „neu“ zu gelten?

    Edit: Mit
    Select Top(100) * From MyTable Order by ID Desc
    erhält man die letzten 100 Einträge. Evtl. hilf das ja bereits. Ggf. Nen Änderungsdatum einbauen und nach dem sortieren.
    "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
    Ein neuer Eintrag ist halt neu, wenn er zu einem früheren Zeitpunkt nicht da war.

    Ein User würde eigentlich auf den aktuellen Stand zugreifen.

    Als konkretes Beispiel nehme man eine beliebige Query und das Programm soll eigentlich nur in annehmbarem Zeitraum bemerken, dass sich eine Zeile dazu gesellt hat.

    Also da mrMo das vorschlägt, was ich dachte, nehmen wir auch mal den schwierigeren Fall an, dass die neue Zeile identisch zu einer alten ist (dementsprechend ohne Zeitstempel).

    Stand alt 12:00 :
    a1122
    b2111
    a2121
    c2121

    Stand neu 12:05 :
    a1122
    b2111
    a2121
    c2121
    a1122
    Erkannt werden soll dann a1122
    Ich hab letztes Jahr ein Programm programmiert, im dem die User (unter anderem) Datensätze in einem DataGridView angezeigt bekommen. Dort wollte ich, dass der User informiert wird wenn es neue Datensätze gibt. Daher läuft dort nun ein Timer, welcher die Anzahl der Datensätze insgesamt abgefragt und mit der letzten (ich merke mir selbige) Anzahl Vergleicht. Geht die Anzahl hoch oder runter (Löschen muss ja auch berücksichtigt werden), so wird dem User ein Button eingeblendet mit dem er bei Bedarf manuell Daten im DataGridView aktualisieren kann.

    In einem anderen Programm, lasse ich einen Timer laufen, der regelmäßig Daten neu läd, und diese dann mit den angezeigten Daten eines DataGridViews vergleicht. Ist ein Wert anders, so wird nur dieser angezeigte Wert aktualisiert/ausgetauscht.
    "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

    mrMo schrieb:

    Geht die Anzahl hoch oder runter (Löschen muss ja auch berücksichtigt werden), so wird dem User ein Button eingeblendet mit dem er bei Bedarf manuell Daten im DataGridView aktualisieren kann.

    Und was passiert wenn ein Datensatz gelöscht und einer erstellt wird? Dann ist die anzahl ganau die selbe.
    Was ist nun mit geänderten Datensätzen?

    Ich würde, um zum einen flexibel genug zu sein und zum anderen um auf der sicheren Seite zu sein drei Zeitstempel mit reinpacken.

    CreationTimestamp, LastchangeTimestamp, DeletedTimestamp (ja, ich lösche in einer DB nicht wenns nicht notwendig ist sondern löschmarkiere nur)

    Die letzten beiden können Nullable sein. So kann ich in der Abfrage sehr felxibel Filtern. Klar muss ich natürlich die werte auch beim aktualisieren oder löschmarkieren auch brav setzen.
    So habe ich aber auch was andere Dinge betrifft die volle kontrolle.

    Aber nur ein Ansatz von mir. (wie ich mir das denken würde, kann ja sein das die Anforderung garnicht so genau ist)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Und was passiert wenn ein Datensatz gelöscht und einer erstellt wird? Dann ist die anzahl ganeu die selbe.
    Was ist nun mit geänderten Datensätzen?
    Das war ja nur ein Beispiel was man so tun kann, um mal zu hören was andere so gemacht haben.

    In meinem Programm können sich Datensätze nicht ändern. Das Löschen der selbigen kommt bei mir so selten vor, dass dieser Fall nicht berücksichtigt werden muss.
    "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

    mrMo schrieb:

    In meinem Programm können sich Datensätze nicht ändern

    OK, ist natürlich ein argument, aber leider wissen wir bis jetzt nicht wie es beim TE so ist. Ich gehe mal ohne konkrete angaben davon aus das Daten auch bearbeitet werden können. Meine Fragen von Oben wurden bis Dato nicht beantwortet weshalb man ohnehin keine vernüftige Antwort geben kann ohne in die Glaskugel gucken zu müssen.

    Evtl. will er sie auch nicht beantworten oder ist sich selbst nicht sicher.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich finde den Ansatz von @Nofear23m interessant und greife mal die Idee auf. Um die aber auch etwas genauer zu machen, würde ich in den Datensatz schreiben welcher User was gemacht hat. In dem fall währe eine Historytabelle evtl. eine gute lösung. So ist dann auch gleich dokumentiert was mit dem Datensatz geschehen ist. Und man könnte evtl. anhand der History Tabelle Datensätze nachladen.

    Die HistoryTabelle natürlich nur wenn unbedingt nötig(ist vlt. auch mit Kanonenkugeln auf Spatzen schießen).
    Ja, eine Protokolltabelle habe ich in meinem WPFNotes Projekt implementiert. Da ist all das was ich oben geschrieben hatte drinnen und dann noch die Protokollierung.
    Und das ganze mit EF so automatisiert das ich mich um diese dinge sogar kaum kümmern muss. Aber das ist jetzt zu Offtopic.

    der TE sollte sich mal mit der beantwortung einiger Fragen auseinandersetzen. ;)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    Na dann ist es ja einfach, und die Sotierung hat dir @mrMo ja schon serviert!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Noch ein Hinweis zum Protokollieren:
    Denkt hier daran was gesichert wird, wie weit werden hier personenbezogene Daten verarbeitet, wann ist nicht das Problem eher das wer und wann. Spätestens wenn der Beriebsrat da was mit bekommt gibt es ggf. Stress.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    INOPIAE schrieb:

    wann ist nicht das Problem eher das […] wann
    ?(
    Was hat der Thread mit personenbezogenen Daten oder gar überhaupt einem Betrieb zu tun? Oder kommt der Hinweis jetzt bei jedem Datenbankthread?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Was hat der Thread mit personenbezogenen Daten oder gar überhaupt einem Betrieb zu tun? Oder kommt der Hinweis jetzt bei jedem Datenbankthread?

    Ja, so einen Hinweis werde ich immer wieder mal bringen, wenn ich der Meinung bin, dass dieser für den Threadersteller oder auch für andere User für Designüberlegungen wichtig sein könnte.
    Das Thema Datenschutz wird bei der Datenbankentwicklung teilweise doch sehr stiefmütterlich behandelt.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Auch wenns OffTopic ist. Ich Arbeite in einem großen Konzern mit vielen Betriebsräten und hier wird alles geloggt und Protokolliert und das ist abgesegnet, noch mehr, es wird gefordert, denn es gibt auch eine Revision und da kann ein Betriebsrat sagen was er will. So, und nun zurück zum Thema, wobei dieses ja eh erledigt ist, kann somit beendet werden.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##