MSSQL ID springt einfach um 1000

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Nils_Kr.

    MSSQL ID springt einfach um 1000

    Hi,
    ich habe ein recht eigenartiges Problem. Mit folgendem Befehl schicke ich Daten an einen SQL-Server:

    VB.NET-Quellcode

    1. sqlCom = New SqlCommand("INSERT INTO Document(DDate,ID_Cat,Comment,Author,Checkstate4,Shift,KW)" & "VALUES(@date,@iD_Cat,@comment,@author,@checkstate4,@shift,@kw)")
    2. sqlCom.Connection = conn
    3. With sqlCom.Parameters
    4. .AddWithValue("date", DateTime.Now.Date)
    5. .AddWithValue("iD_Cat", CInt(CategoryComboBox.SelectedValue))
    6. If Not RTBComment.Text = Nothing Then .AddWithValue("comment", RTBComment.Text) Else .AddWithValue("comment", "")
    7. If Not TBName.Text = Nothing Then .AddWithValue("author", TBName.Text) Else .AddWithValue("author", "")
    8. If CheckBoxCancel.Checked Then .AddWithValue("checkstate4", 3) Else .AddWithValue("checkstate4", WorstCase)
    9. If ComboBoxShift.Text = "Frühschicht" Then
    10. .AddWithValue("shift", 0)
    11. ElseIf ComboBoxShift.Text = "Spätschicht" Then
    12. .AddWithValue("shift", 1)
    13. Else
    14. .AddWithValue("shift", 2)
    15. End If
    16. .AddWithValue("kw", DateTimeFormatInfo.CurrentInfo.Calendar.GetWeekOfYear(DateTime.Now, DateTimeFormatInfo.CurrentInfo.CalendarWeekRule, DayOfWeek.Monday))
    17. End With
    18. sqlCom.ExecuteNonQuery()
    19. If CheckBoxCancel.Checked = False Then
    20. For Each tc As TripleCheck In FLPTripleCheck.Controls
    21. Dim SqlEntryCommand As SqlCommand = New SqlCommand("INSERT INTO Entry(ID_Doc,ID_Checkpoint,Checkstate3)" & "VALUES(@id_Doc,@iD_Checkpoint,@checkstate3)")
    22. SqlEntryCommand.Connection = conn
    23. With SqlEntryCommand.Parameters
    24. .AddWithValue("id_Doc", IDDoc)
    25. .AddWithValue("id_Checkpoint", tc.description_ID)
    26. If CheckBoxAllesIO.Checked Then .AddWithValue("checkstate3", 0) Else .AddWithValue("checkstate3", tc.triplestatecheck)
    27. End With
    28. SqlEntryCommand.ExecuteNonQuery()
    29. Next
    30. End If


    Eigentlich sollte sich die ID immer um genau einen Wert erhöhen, falls ein neuer Eintrag erstellt wird. Die ID ist als Primärschlüssel ausgewählt, Null-Wert zulassen steht auf False und (Ist Identity) auf True, ID-Ausgangswert ist 1 und ID-Inkrement ebenfalls 1. Jetzt ist es in den letzten zwei Wochen schon zweimal vorgekommen, dass die ID's von Document und Entry einfach um 800-1000 Werte nach vorne springen und dann weiterzählen als wäre nichts gewesen.
    Konkret habe ich bei Document einen Sprung von 468 auf 1446 und von 1503 auf 2501, bei Entry geht es zur gleichen Zeit von 5129 auf 5840 und von 6502 auf 7464. Der PC auf dem der Server läuft ist durchgängig eingeschaltet, ich bin mir nicht sicher, aber ich glaube, dass an den 2 Tagen der Pc sich aufgrund von Updates neugestartet hat.
    Aber ein Neustart sollte doch nicht einfach die IDs springen lassen oder? Rückgängig machen lässt sich der Sprung übrigens nicht. Wenn ich alle Datensätze nach dem Sprung lösche wird trotzdem unverändert weitergezählt.

    Die Funktionalität ist dadurch bisher nicht beeinträchtigt, aber sollten sich die Sprünge plötzlich häufen könnten mir irgendwann einfach die Zahlen ausgehen. Daher wüsste ich gerne wieso es zu diesen Sprüngen kommt und wie ich die verhindern kann.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Hi,

    also normal ist das Verhalten nicht. Ich kann dir aber auch nicht 100%ig sagen woran es liegt.
    Es gibt aber einen Verdacht.
    Wenn du beim Insert einen Fehler hast, wie zum Beispiel einen Varchar mit der Länge 100 in eine Spalte mit Varchar der Länge 50 zu inserten, dann wird die Identiy Row dennoch erhöht. Oder auch wenn ein falsches Datum inserted wird usw.
    Ich sehe bei deinen Inserts keine Fehlerbehandlung. Ich vermute du hast iwelche fehlerhaften Inserts.

    Deine Identity Row kannst am SQL Server btw auch reseeden mit:

    SQL-Abfrage

    1. DBCC CHECKIDENT ('tablename', RESEED, 1000)


    Dann gehts bei 1001 wieder los beim nächsten Insert.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    das ganze sitzt in einem Try-Block:

    VB.NET-Quellcode

    1. Try
    2. ...
    3. Catch myerror As SystemException
    4. MsgBox(myerror.Message.ToString)
    5. End Try


    Wenn beim Insert was schiefgehen sollte gibt es eigentlich eine Fehlermeldung. Trotzdem werde ich den Befehl selbst nochmal durchgehen.

    Danke schonmal für den Hinweis mit dem RESEED. Sollte es nochmal zu einem großen Sprung kommen kann ich den Fehler rückgängig machen, wobei das natürlich langfristig keine Lösung ist.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Dieses Verhalten ist tatsächlich gewollt und passiert nach einem Neustart des Servers. Das ganze war mir neulich auch aufgefallen.

    stackoverflow.com/questions/14…om-6-to-1000-on-7th-entry

    Der erste Link in der Antwort führt zu codeproject, wo beschrieben wird, wie man das gewohnte Verhalten erzielt.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Mono schrieb:

    Ehm, dass ist ja auch keine Fehlerbehandlung ;)


    Da hast du recht, aber fehlerhafte Inserts werden bemerkt und ein Fehler ist schon lange nicht mehr aufgetreten.

    @Lukas : Danke für den Hinweis. Wenn der Sprung nur bei einem Neustart passiert hab ich noch ein paar Jahrzehnte bis ich auf 64bit umsteigen muss :D

    Witziger Kommentar aus dem Link: "it's all perfectly normal until you run out of ints" :D
    Option strict = on

    If it's stupid and it works it ain't stupid.