Aktualisierung Dataset

  • VB.NET

Es gibt 55 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Hmm, mir scheint, wir reden aneinander vorbei oder ich habe es mißverständlich formuliert.

    Der Reload-Code

    VB.NET-Quellcode

    1. Private Sub Reload()
    2. DtsAuftragsbuch.Clear()
    3. For Each tb As DataTable In DtsAuftragsbuch.Tables
    4. tb.BeginLoadData() 'deaktiviert während des Ladens AktualisierungsVorgänge des Databindings
    5. Next
    6. DtsAuftragsbuch.ReadXml(_DataFile.FullName)
    7. For Each tb As DataTable In DtsAuftragsbuch.Tables
    8. tb.EndLoadData()
    9. Next
    10. DtsAuftragsbuch.EnforceConstraints = True 'tb.BeginLoadData setzt autom. EnforceConstraints.False - also zurücksetzen
    11. DtsAuftragsbuch.AcceptChanges()
    12. End Sub


    ...welcher in

    VB.NET-Quellcode

    1. Private Sub timDelay_Tick(sender As Object, e As EventArgs) Handles timDelay.Tick
    2. timDelay.Stop()
    3. Reload()
    4. End Sub

    aufgerufen wird.
    tja, weiss ich auch nicht.
    Sieht ok aus.
    Der einzige Unterschied zu meim ist, dasss meine PKs ins Negative zählen statt ins Positive.
    Kannst du eine Spiel-anwendung basteln, die den Fehler reproduziert, und anhängen?
    Das Gehuddel mittm FSW braucht ja noch garnet drinne sein: Einfach nur ein Dingens, wo man mit Buttons Save, Reload die Dataset.xml speichert/lädt.
    Und wo dann diese PK-Wunderlichkeit auftritt.
    So gern wie ich das machen würde, ich denke nicht, dass ich das sinnvoll gekürzt bekomme. :(

    Eine Verständnisfrage, das Clear im Reload leert mein Dataset. Ich gehe davon aus, die Struktur bleibt erhalten und nur die Inhalte werden gelöscht. Ich habe den Reload nun mal ohne ReadXML ausgeführt. Scheinbar weiß er dennoch, was die letzte Zeile war, da er mit der Richtigen ID weitermachen würde obwohl die XML nicht neu geladen wurde und egal wie oft ich den Reload ausführe.
    Somit würde ich es dahingehend eingrenzen, dass der ReadXML irgendwas veranstaltet was nicht passt.

    Vielleicht ist das ja hilfreich für die Fehlersuche.
    Ich weiß keinen Rat mehr, ich habe das Phonebook-Projekt mit meinem verglichen. Ich finde keinen Unterschied.
    Die PKs habe ich zum Testen auf negative Zählweise umgestellt, gleiches Problem, dann halt nur negativ.
    Egal was ich mache, sowie das dts geleert und die xml neu eingelesen wird, rechnet er immer die existierenden Rows zu der eigentlich aktuellen ID hinzu.
    Ich könnte mir jetzt nur vorstellen, eine Krücke einzubauen, die die existierenden Rows wieder subtrahiert.
    Davon abgesehen das ich nicht wüsste wie ich das umsetzen soll, ist es auch nicht sauber, da es zwar das Problem löst aber die Ursache nicht.
    Ich werde wohl aufgeben, außer es hat noch jemand eine Idee.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Madde“ ()

    Was passiert mit einer neuen, von anderen DataTables unabhängigen Dummy-DataTable? Gleiches ID-Problem oder nicht?
    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.
    Das einzige, was ich wüsste, wie man das von dir bbeschriebene Verhalten hinkriegen könnte, wäre, dass das iwelche DataTable_Changed-Events verarbeitet sind, und Unfug treiben.
    Die werden auch beim Einlesen einer XmlDatei für jeden Datensatz gefeuert.
    Abrer ich kann in deine Anwendung ja nicht reingucken. Nur du kannst in meine reingucken, udn da ist sowas ja halt nicht drin.
    Leg doch mal ein neues Projekt an, kopier Dein DataSet-Inhalt rein und bring es zum Laufen (erstmal ohne die XML-Datei). Wenn das mit Testdaten klappt, dann mit XML-Datei. Dann kannst Du viel besser entscheiden, ob es an den Daten liegt (eher nicht), den tDS-Einstellungen (möglich) oder am Projektcoderest (wahrscheinlich).
    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.
    So, ich habe nun eine Rohversion. Viel funktioniert hier nicht, muss aber auch nicht, denn das Problem wird sichtbar.
    Klick auf neuer Auftrag - laufende Nummer passt
    Erst Klick auf Reload, dann Neuer Auftrag - besagte Problematik

    Ich hoffe, ihr könnt damit etwas anfangen

    Grüße
    Dateien
    • Test.zip

      (165,24 kB, 64 mal heruntergeladen, zuletzt: )
    Ah, ok. Jetzt kann ich das Problem zumindest nachstellen. Wobei das mit der Nachstellung sich sehr leicht zeigt. Man nehme eine DataTable mit AutoIncrement-Spalte, ein daran gebundenes DGV, bei dem man Zeilen hinzufügen kann und gehe in die letzte Zeile. Es wird eine neue Zeile mit erhöhter ID erstellt. Verlässt man die Zeile ohne Dateneigabe, wird diese Zeile entfernt. Geht man wieder in die letzte Zeile, wird wieder eine neue Zeile erstellt, allerdings nicht mit der gleichen ID, sondern mit der nächsten. Schau mer mal, ob man das tDS bzw. die DataTable dazu bringen kann, die verworfenen Zeilen wieder zu vergessen.

    ##########

    @Madde
    Nee, ich glaub das wird nix. Es scheint zwar in der sehr versteckten Variable autoInc der entsprechenden Column zu stecken, aber da per Reflection rumzuspielen, halte ich für … nicht ratsam. Dann soll der Computer mit den Spaltenwerten machen, was er will. Und Du könntest einfach für nen neuen Auftrag sowas machen: NeuerAuftrag.Auftragsnummer = DeineAuftragstabelle.ErmittleHöchsteAuftragsnummner + 1. Geht mit der LINQ-Max-Extension.
    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Ich hab eine Lösung:

    VB.NET-Quellcode

    1. Private Sub Reload()
    2. DtsAuftragsbuch.Clear()
    3. For Each tb As DataTable In DtsAuftragsbuch.Tables
    4. tb.BeginLoadData() 'deaktiviert während des Ladens AktualisierungsVorgänge des Databindings
    5. Next
    6. Dim dts = New dtsAuftragsbuch
    7. dts.ReadXml(datenpfad.FullName)
    8. DtsAuftragsbuch.Merge(dts, False, MissingSchemaAction.Error)
    9. dts.Dispose
    10. For Each tb As DataTable In DtsAuftragsbuch.Tables
    11. tb.EndLoadData()
    12. Next
    13. DtsAuftragsbuch.EnforceConstraints = True 'tb.BeginLoadData setzt autom. EnforceConstraints.False - also zurücksetzen
    14. DtsAuftragsbuch.AcceptChanges()
    15. End Sub
    Jetzt bin ich nochmal unverschämt. Folgendes Szenario.
    Klick Neuer Auftrag - Zeile wird mit ID angelegt. Nun möchte ich aber den Vorgang abbrechen und die Zeile mit gleicher ID neu beginnen.
    TblAuftragsbuchBindingSource.EndEdit() oder TblAuftragsbuchBindingSource.CancelEdit() funktionieren da nicht. Er nimmt immer die Folge-ID der soeben gelöschten Zeile.
    Scheinbar hat er die soeben vergebene, aber abgebrochene ID noch irgendwo im Bauch, denn der Reload funktiuoniert da nicht.
    Lässt sich das, ähnlich dem Reload, umsetzen?

    Grüße
    Sowohl den Speicherort der ID als auch den Workaround habe ich gepostet.
    Du könntest es wohl mit der Lösung von EdR machen, indem Du beim Auftragsanlegen eben diesen Merge machst.
    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.
    Ich habe es jetzt so gelöst. Sicher nicht die eleganteste Lösung aber sie funktioniert. Der Programmierer sieht das sicher anders ;)
    Damit auch sichergestellt ist, dass der letzte Eintrag verwendet wird und vorher nicht irgendwo ins DGV geklickt wurde, springt er vorher in die letzte Zeile.

    VB.NET-Quellcode

    1. Private Sub ButtonAbbruch_Click(sender As Object, e As EventArgs) Handles ButtonAbbruch.Click
    2. If dgv.AllowUserToAddRows Then
    3. dgv.CurrentCell = dgv(0, dgv.Rows.Count - 2)
    4. Else
    5. dgv.CurrentCell = dgv(0, dgv.Rows.Count - 1)
    6. End If
    7. DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementStep = -1
    8. DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementSeed = -1
    9. DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementStep = 1
    10. DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementSeed = 1
    11. End Sub


    Nochmals Danke für Eure Unterstützung!

    Grüße
    Hallo,

    ich möchte kein neues Thema aufmachen, da es ja in dieses Projekt gehört.

    Mir gehts um die parallele Verwendung der XML. Da zwei Programminstanzen laufen sollen, ist eine gleichzeitige Nutzung bzw Änderung ja nicht möglich, da einer von beiden rausfliegt.
    Was kann ich einbauen, dass während die eine Instanz Änderungen vornimmt, die andere dies gemeldet bekommt und keine Änderungen vornehmen kann, bis die XML nicht mehr in Verwendung ist.
    Es muss nichts gewaltiges sein, eine Meldung das die Daten soeben bearbeitet werden reicht vollkommen aus.
    Recherchen bringen mich meist zu Filestream aber ich weiß nicht wie ich das umsetzen soll.
    Ich wäre euch dankbar, wenn ihr mich in die richtige Richtung bringen könntet.

    Grüße