Fehler beim Speichern eines neuen Datensatzes nach Löschung der letzten Zeile

  • VB.NET
  • .NET 4.5

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Fehler beim Speichern eines neuen Datensatzes nach Löschung der letzten Zeile

    Hallo liebes vb-paradise Forum,

    wir haben ein Problem bei der Programmierung eines Programmes für Seminarmanagement.
    Nun haben wir folgendes Problem:

    Jeder Dozent hat eine eindeutige ID (fortlaufend mit AutoWert in Access). Wenn wir nun einen neuen Dozenten anlegen möchten und zuvor die letzte Zeile in der Datenbank gelöscht haben - Dozent mit der ID 12 wird gelöscht und Dozent mit der ID 13 soll angelegt werden - bekommen wir folgende Fehlermeldung in VB: Siehe Screenshot.


    Lieben Gruß,
    Peter
    Bilder
    • 1.PNG

      20,2 kB, 831×417, 29 mal angesehen
    • 2.PNG

      72,79 kB, 992×607, 32 mal angesehen
    Access vergibt doch die IDs der Datensätze selbst. Hol dir lieber nach dem Speichern die ID als diese manuell irgendwo hochzuzählen. Weil, wenn was gelöscht wurde, wird die ID nicht nochmal vergeben.

    Der Fehler der dir da angezeigt wird, scheint wohl ein Folgefehler zu sein.

    Ich finde die Benennung nicht so gut. objdozent ist ja scheinbar dein DataSet. Da tät ich eher dsDozent nehmen. Den Präfix Obj interpretiere ich als Objekt, nicht als DataSet.

    Bitte poste dich deinen Code hier im Forum anstatt Screenshots hoch zu laden.
    "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
    kann ich dann das Holen der ID komplett "vernachlässigen" ?

    die Benennung haben wir leider vorgegeben bekommen :/

    Danke dir schon mal!

    VB.NET-Quellcode

    1. If cmbKategorie.Text = "Dozent" Then
    2. If txtID.Text = "" Then
    3. 'Neuanlage
    4. 'Ermitteln und setzen der ID
    5. dozId = 1 + objDBDozent.getSelect("SELECT MAX(dozID) FROM tblDozent").Tables(0).Rows(0).Item(0)
    6. objDozent = objDBDozent.getDozentInfo(dozId)
    7. 'objDozent = objDBDozent.getTableFiltered("tblDozent", "dozID=" & dozId)
    8. objDozent.Tables(0).Rows.Add()
    9. objDozent.Tables(0).Rows(0).Item(0) = dozId
    10. objDBDozent.saveDataset(objDozent)
    11. End If
    12. 'Änderung des Namens oder der Telefonnummer
    13. objDozent = objDBDozent.getDozentInfo(dozId)
    14. objDozent.Tables(0).Rows(0).Item(1) = txtName.Text
    15. objDozent.Tables(0).Rows(0).Item(2) = txtTelefon.Text
    16. objDBDozent.saveDataset(objDozent)
    17. If txtID.Text = "" Then
    18. txtID.Text = dozId
    19. End If
    20. End If

    PeterStrass schrieb:

    kann ich dann das Holen der ID komplett "vernachlässigen" ?


    Hast du ja bereits und nun sitzen wir hier ;)

    Du willst ja später auch Änderungen am Datensatz vornehmen. Kennst die ID nicht, wohin sollen die Änderungen dann gespeichert werden?

    Edit: dozId ist bei dir ein String? Falls ja, schreib mal ganz oben im Code in Zeile 1: Option Strict On
    "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

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

    aber aktuell holen wir die ID doch? Das Speichern an sich und Bearbeiten klappt im Moment schon.. nur dieser eine Fehler, der oben beschrieben ist, taucht immer auf :/

    Wir legen einen Dozenten an mit der letzen vergebenen ID (Bspw. 12), dann löschen wir diesen wieder und wollen erneut einen Dozenten anlegen (müsste folglich die ID 13 besitzen). Beim Speichern entsteht die Fehlermeldung oben, jedoch ist die ID (aber ohne weitere Inhalte) in der DB gespeichert.
    Das hier ist das Problem:
    dozId = 1 + objDBDozent.getSelect("SELECT MAX(dozID) FROM tblDozent").Tables(0).Rows(0).Item(0)

    Hier holst du dir die höchste ID und rechnest +1 dazu.

    PeterStrass schrieb:

    (...)müsste folglich die ID 13 besitzen (...)


    Leider nein. Wenn du einen Datensatz mit der ID 13 löschst und dann einen neuen Datensatz anlegst, hat dieser die ID 14, nicht 13(!). Hat Access einmal eine ID vergeben wird diese nicht neu vergeben, egal ob es den zugehörigen Datensatz noch gibt.

    Und ganz wichtig:
    dozId ist bei dir ein String? Schreib mal ganz oben im Code in Zeile 1: Option Strict On
    "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

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

    Gerne :)

    Nur damits nicht überlesen wurde:
    Schreib mal ganz oben im Code in Zeile 1: Option Strict On
    "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
    @PeterStrass Willkommen im Forum
    Schade, dass ihr nicht typisiert mit dem Dataset umgeht...
    Wie sieht euer Datenmodell aus?
    Wie verbindet ihr euch mit der DB?
    Wie sieht es mit Databindung aus?
    Habt ihr schon die Tuts von @ErfinderDesRades angesehen? - er hat hier ganz tolle Artikel zu diesem Thema verfasst...
    Man kann auch ganz ohne DB vorerst sein Datenmodell im Dataset modellieren und die Daten einfach in ein .XML-File halten...