Problem beim Speichern von DataSet-Datensätzen in DB

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Noyne.

    Problem beim Speichern von DataSet-Datensätzen in DB

    Hallo Leute ...
    Ich habe die Hoffnung, dass mir grad einer weiterhelfen kann (vor allem @ErfinderDesRades )
    Ich habe mir den Code von dieser Seite hier typisierter Db-Zugriff mit Connectoren abgeändert in mein Programm übernommen.
    Der Code steht in meinem Hauptprogramm!!
    Wenn ich ein UnterForm aufrufe, übergebe ich natürlich das DataSet vom MainForm und ich greife beim Speichern auf die Save-Sub meines MainForms zu.
    Das Ding ist, es triggert bei mir NIE diese RequeryID-Sub, obwohl ich die AddHandler drinne hab ...

    Kann es daran liegen, dass ich von einer anderen Form versuche, den Datensatz über die MainForm-Subs zu speichern?! Mache ich es mir da ein bisschen ZU einfach und müsste eigentlich bei jedem Form eine separate Speichern-Sub anlegen??
    Oder liegt es daran, dass ich nur einige und nicht alle Adapter zum Speichern übergebe?! (Beispiel: Ich speichere einen Apothekenmitarbeiter. Da muss natürlich die Apotheke als Parent mit, aber das Heim beispielsweise nicht)
    Ich versteh's ehrlich nich und hoffe, irgendwer kann mir helfen ...

    GLG, eure Noyne
    Your computer is running... You better go chase it! :P :D

    Noyne schrieb:

    Kann es daran liegen, dass ich von einer anderen Form versuche, den Datensatz über die MainForm-Subs zu speichern?
    Ja, das ist ein gängiger Design-Fehler.

    Vermutlich hast du einen Eingabe-Dialog.
    Dialoge sollten ihre Eingaben nie selbst verarbeiten. Wenn du nach Eingabe der Daten ins Dataset dieses speichern willst, dann mach das im Mainform, nachdem der Dialog geschlossen wurde.
    Und dann halt Haltepunkt setzen und überpfrüfen, ob die Requery ausgeführt wird.

    Aber eigentlich brauchst du auch garnet nach Eingabe eines Apothekers gleich speichern. Die Speicher-Methode speichert alle Änderungen, ob das nun viele sind oder wenige. Und das macht sie, wann immer du willst - das musst du nicht an einen Dialog binden.
    Kannste natürlich, wenn das dolle ist. Und wenn das dabei failt, dann failt es auch bei anderen Speicher-Vorgängen - das würde ich also auch mal unabhängig von dem Dialog überprüfen.
    Erstmal danke für deine Antwort ;)

    ErfinderDesRades schrieb:

    Dialoge sollten ihre Eingaben nie selbst verarbeiten. Wenn du nach Eingabe der Daten ins Dataset dieses speichern willst, dann mach das im Mainform, nachdem der Dialog geschlossen wurde.
    An sich wäre das so ein "MainForm ruft Apotheke auf -> Apotheke ruft Apothekenmitarbeiter auf"-Ding und dann eben das Speichern eines Apo-Mitarbeiters ... Aber ich glaub', ich hab' eine gangbare Alternative gefunden (s.u.)

    ErfinderDesRades schrieb:

    Aber eigentlich brauchst du auch garnet nach Eingabe eines Apothekers gleich speichern.
    Doch, leider schu ... Auch wenn man's ja eigentlich nicht hofft, aber es könnte ja mal sein, dass mein Programm aus einem mir unerfindlichen Grund crasht (alle anderen versuch' ich vorher schu "abzufangen", sodass sie gar nich erst auftreten) und mir die Arbeit der letzten halben Stunde fehlt, weil halt nur das Mainform speichert und nicht die einzelnen Dialoge und ich jetzt fleißig Bewohner angelegt habe in meinem Bewohner-Dialog ... Deswegen soll bei jedem Speichern (Neuanlage und Update) und Löschen gespeichert werden.
    Ich hab' allerdings mal probiert, was passiert, wenn ich die Speichern-Sachen in die Dialoge einbaue. Da scheint das Speichern doch zu funktionieren. Also baue ich das jetzt einfach noch fix um und gut ist's ...
    Your computer is running... You better go chase it! :P :D
    Mal nochwas dazu, wenn ich dich noch mal bemühen darf, @ErfinderDesRades :
    Mal angenommen, ich würde von meinem MainForm aus eine neue Apotheke anlegen und die speichern und den Datensatz an mein MainForm als ApothekenRow zurückgeben und würde jetzt ebenfalls vom MainForm aus den Apothekenmitarbeiter-Dialog aufrufen und diesem die gerade erstellte ApothekenRow mitgeben. (macht wenig Sinn, aber nur in der Theorie)
    Muss ich beim Speichern dann trotzdem den "ApothekenTableAdapter mitspeichern" oder reicht da der neuangelegte Mitarbeiterdatensatz?!
    Your computer is running... You better go chase it! :P :D
    also ich denke garnet so Tabelleweise.
    Bei mir speichere ich das Dataset und fertig.

    Du hast dir da den blödesten Abspeicher-Krüppel rausgefischt, den ich je veröffentlicht habe, ich weiß garnet, was die Leuts immer daran so dolle finden.
    Nimm mindestens Dataset->Db, und schmeiss die typisierten Tableadapter einfach runter vons Dataset - haste auch gleich mal 5000 generierte Zeilen eingespart.

    Aber wenn du so weiter machen willst: Ja, wenn ein übergeordneter Datensatz hinzugekommen ist, und ein diesem untergeordneter auch noch, dann muss man den übergeordneten zuerst abspeichern, sonst kann beim Abspeichern des untergeordneten dieser sich nicht unterordnen, denn der Übergeordnete ist ja (noch) nicht da, in der Datenbank.

    Wie gesagt: Dataset->Db kümmert sich um solche BoilerPlate-Problemchen (von denen es noch mehr gibt)..

    ErfinderDesRades schrieb:

    Nimm mindestens Dataset->Db
    Das ist einfach ziemlich super und funktioniert natürlich ooohne Problem ... Bin begeistert :D
    Wieso weiß ich nich wo du wohnst?! Dann könnte ich grade mal vorbeikommen und dir nen dicken, fetten Schmatzer auf die Wange drücken ;)

    Dankeeee :D
    Your computer is running... You better go chase it! :P :D