Neue Zeile in Datatable erzeugen und ID erst nach .AcceptChanges() vergeben möglich?

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von metzelmax.

    Neue Zeile in Datatable erzeugen und ID erst nach .AcceptChanges() vergeben möglich?

    Hallo.

    Ich habe eine Datatable mit einer ID-Spalte (Autoincrement, Primärschlüssel, Unique) erstellt, in welcher ich verschiedene Messwerte speicher. Das Funktioniert auch ganz gut, allerdings wird bei jedem aufrufen der Funktion eine neue Zeile und damit auch eine neue ID angelegt. Das ist an sich super und gewollt. Es sollen jedoch nur Messwerte gespeichert werden, wenn die jeweilige Checkbox markiert ist. Ansonsten werden die Änderungen am Ende verworfen. Beim nächsten Aufrufen der Funktion wird dann trotz .RejectChanges() die ID um eins weiter erhöht. Wenn ich das Programm starte und erst nach ein paar minuten die Aufzeichnung beginne, steht die ID dann bereits bei weit über 100 in der ersten Zeile.

    Die Funktion wird öfter aufgerufen, da alle Label durch Geräteevents, welche beim abrufen der jeweiligen Messwerte feuern, mit aktuallisiert werden.

    Hier mal eine vereinfache Darstellung was ich mache:

    VB.NET-Quellcode

    1. Dim MessZeile As DS_Values.Dt_AlleMesswerteRow = DS_Save_Values.Dt_AlleMesswerte.NewDt_AlleMesswerteRow
    2. With MessZeile
    3. .Time = CDate(DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss.ff"))
    4. .T_Ist = MyTemperature.Istwert 'Wert wird von Gerät ausgelesen, ein Event aus der jeweiligen Geräteklasse aktuallisiert dann alle Labels entsprechend
    5. end with
    6. If Chbx_Aufzeichnung.Checked Then 'nur Speichern wenn Checkbox angekreuzt
    7. DS_Save_Values.Dt_AlleMesswerte.AddDt_AlleMesswerteRow(MessZeile)
    8. DS_Save_Values.AcceptChanges()
    9. Chrt_Messwerte.DataBind()
    10. Chbx_Aktuell.Checked = Not Chbx_Aktuell.Checked
    11. Else
    12. MessZeile.Delete()
    13. DS_Save_Values.Dt_AlleMesswerte.RejectChanges()
    14. End If


    Das ganze ist bisher nur ein "Schönheitsmanko". Gibt es eventuell eine Funktion welche die ID-Spalte beim Löschen der letzten Zeile mit zurücksetzt? Oder kann ich eine Zeile erstellen und füllen ohne das bereits bei der Erstellung die ID hochgezählt wird? Also das die ID erst geschrieben wird wenn ein .AcceptChanges() folgt?
    Die neue ID wird in New_messwerteZeile_Row_WasFür_einGrauenHaft_LangerName_WillstDuWirklich_MIt_solchenUNgetümenProgrammierenRow() erzeugt.
    Soll sie nicht erzeugt werden, dann ruf den Bandwurm nur auf, wenn eine Row auch wirklich benötigt wird.

    Oder lass es einfach. Wie du sagst - ein reiner "Schönheitsfehler", der für die Verarbeitung keinerlei Auswirkung hat.

    Eine Id-Rücksetze-Funktion gibt es nicht. Man geht davon aus, dass während einer Laufzeit Integer.MaxValue niemals erreicht wird.
    Eine Gewisse Rücksetzung findet ggfs statt durch die Datenbank, die ja ihre eigene ID vergibt.
    Danke für die Antwort,

    ich habe die Zeile angelegt um diese dann gleich mit werten zu füllen. Hinterher entscheidet sich dann ob das ganze aufgehoben wird oder nicht. Man kann das sicher auch eleganter lösen aber mir war da nix besseres eingefallen. Vorhin habe ich eine Variante gefunden, welche bei dem problemchen erstmal hilft. Ich habe dazu folgendes Konstrukt verwende:

    VB.NET-Quellcode

    1. Private DS_Save_Values As New DS_Values, Wegwerfdaten As New DS_Values
    2. 'und in der Funktion dann folgendes
    3. Dim MessZeile As DS_Values.Dt_AlleMesswerteRow
    4. If Chbx_StarteAufzeichnung.Checked Then
    5. MessZeile= DS_Save_Values.Dt_AlleMesswerte.NewDt_AlleMesswerteRow
    6. Else
    7. MessZeile = Wegwerfdaten.Dt_AlleMesswerte.NewDt_AlleMesswerteRow
    8. End If


    Nicht so schick, bewirkt aber genau das was ich wollte. Wenn ich zwischendurch pausiere beginnt die ID beim wiederaufnehmen der Aufzeichnung an der erwarteten Stelle (ein größer).

    PS: Stimmt zwar das der Tabellenname etwas lang ist aber bis jetzt komm ich noch klar:).