Mit Dataset ganze Tabelleninhalte löschen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Marsianer.

    Mit Dataset ganze Tabelleninhalte löschen

    Sorry, mal wieder BrettVorDemKopf.

    Ich will in meiner Anwendung die Datenbank resetten können (User soll quasi mit leerer DB bei Null beginnen können). Das bedeutet, dass die ganzen Tabelleninhalte inner DB gelöscht werden sollen. Danach müssen gewisse Tabellen für den internen Gebrauch programmgesteuert wieder mit Standardwerten gefüllt werden. Bisher baue ich manuell eine Connection auf und fahre SQL-Commands direkt gegen die DB. Funktioniert auch, aber hey, wofür habe ich eigentlich ein typisiertes Dataset. Wollte ich also meine Funktion umschreiben und hab es so versucht:

    VB.NET-Quellcode

    1. Private Sub Standardwerte()
    2. DsFinanzKnecht.Buchungsart.Clear()
    3. ...weitere Tables.Clear...
    4. DsFinanzKnecht.Save(Me)
    5. Dim BArow1 As dsFinanzKnecht.BuchungsartRow
    6. BArow1 = DsFinanzKnecht.Buchungsart.NewRow
    7. BArow1.Name = "Ausgabe"
    8. DsFinanzKnecht.Buchungsart.Rows.Add(BArow1)
    9. Dim BArow2 As dsFinanzKnecht.BuchungsartRow
    10. BArow2 = DsFinanzKnecht.Buchungsart.NewRow
    11. BArow2.Name = "Einnahme"
    12. DsFinanzKnecht.Buchungsart.Rows.Add(BArow2)
    13. ... (fülle auf diese Arte weitere Tables)...



    (achso Hinweis: das DataSet spreche ich über die DBExtensions des EdR an).

    Funktioniert aber nicht. Ich kriege zwar bei den .Clear-Aktionen keine Fehlermeldung, dafür aber beim Rows.Add. Nämlich, dass die Datensätze mit den gewählten Namen (handelt sich hierbei nämlich um die PrimKey-Spalte) schon vorhanden sind. Also klappt das Löschen wohl nicht richtig. Ich finde aber über IntelliSense und Google usw. nix anderes, was sich zum Löschen von Tabelleninhalten (das Schema soll ja erhalten bleiben) anbieten würde.

    Kann mir jemand helfen? ;(
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    proggst du Strict Off?? machma Option Strict On!

    Und dann verwende die typisierten Add-Methoden, hier wohl die beiden Überladungen von DsFinanzKnecht.Buchungsart.AddBuchungsartRow("Ausgabe") oder sows.

    Warum die Row noch da ist, obwohl du gecleart hast, ist mir unerfindlich - überprüf mal BuchungsArt.Count, und ob das stimmt, und was in BuchungsArt(0) dann drinne ist.

    ErfinderDesRades schrieb:

    proggst du Strict Off??

    oh Sch... :pinch: :pinch: :pinch:

    Ich habs am Anfang weggelassen, weil ich ständig Fehlermeldungen bekam, die ich (noch) nicht verstand und irgendwann hatte ich davon die Schnauze voll und wollte erstmal weiterkommen mit meinem Programm.
    Ich habs jetzt eingeschaltet. 110 Fehler angezeigt bekommen :whistling: :whistling: :whistling:
    Alle beseitigt :P
    Allerdings das eine oder andere Mal nur mit Konvertierungskrücken. Hätte man gleich Option Strict on gehabt, hätte man gleich gemerkt, wo ein Fehler in der Konzeption ist. Nun gut, sei es drum. Jedenfalls ist (und bleibt) Option Strict On.

    Habe auch auf die typisierten Add-Methoden umgestellt. Nach dem Clear und DataSet.Save ist BuchungsArt.Count = 0.
    Ich bin die ganze Funktion jetzt nochma im Einzelschrittverfahren durchgegangen. Auweia :whistling: :pinch:
    Weißt du, wo er hakt? Er löscht die Tables tadellos, er fügt auch die neuen Werte tadellos ein. Und dann hab ich zum Schluss nochmal ein DataSet.Save(me) gemacht, weil ich dachte, ich muss ja nun das DataSet erstma so auf die DB übertragen. Und da hälter an und meckert, dasser die Werte doch nicht nochma eintragen kann, die sind doch schon da!
    Sagmal: Speichern die Extensions klammheimlich im Hintergrund ab oder sowas? Ich dachte echt, ich müsste zum Schluss nochn .Save machen, um die neuen Standardwerte zu persistieren!
    Ich habe jetzt das .Save auskommentiert und die Standartwerte-Sub läuft problemlos durch.

    Problem ist jetzt: Wennich Programm schließe und neu Aufrufe, sind die alten Werte alle wieder da. Iwie müssen die Löschungen noch in die DB zurück. Wird noch verrückter: Wennich dann eine Form aufrufe, in der ich eine Tabelle mit Standardwerten ergänzen kann (hier: der Benutzer darf zusätzliche Kategorien hinzufügen), dann zeigter mir nach dem Durchlaufen der Standardwertefunktion ein leeres DGV an, also sind die Werte wunschgemäß gelöscht. Aber wennich die Form dann schließe, fragter mich, ob ich die Änderungen abspeichern will (wird über DataSet.HasChanges abgefragt und dann über DataSet.Save(me) realisiert). Sag ich "Ja", dann taucht wieder diese verflixte SqlCeException auf. :cursing: . Also krieg ich wohl die Werte im DataSet gelöscht, aber es wird nicht auf die DB übertragen, obwohl ich nach dem .Clear (ich cleare inzwischen einfach das gesamte DataSet und das ist danach auch leer) alle Tabellen leer sind.

    Ich dachte auch, dass das was damit zu tun haben kann, dass im Debugging-Modus immer eine Kopie der SqlCE-DB erstellt und somit die alten Daten immer wieder zurückkommen. Aber ich habe das Projekt mal erstellt und auch im Release kommt es zu diesem Fehler. Ich glaub, ich kehr bald zu meiner alten SQL-Funktion zurück. Die war zwar primitiv, aber hat anstandslos gemacht, was ich wollte :(
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    sorry - ich depp!
    Dataset/DataTable.Clear fetzt auch die Änderungsverfolgung weg. Daher werden keine Löschungen an die DB persistiert.

    Du musst also jede DataRow selbst löschen. Dabei hilft dir ja die Löschweitergabe, also soo viel wird das auch nicht:

    VB.NET-Quellcode

    1. Sub DeleteAll(ByVal dts As DataSet)
    2. For Each tb In dts.GetRankedTables
    3. If tb.Rows.Count = 0 Then Continue For
    4. For Each rw As DataRow In tb.Rows
    5. rw.Delete()
    6. Next
    7. Next
    8. End Sub