none
Erreur d'incrémentation du compteur ... RRS feed

  • Question

  • Bonjour,

    Dans le cadre d'applications développées avec Visual Studio 2013 Windows Forms C# et SQL Server 2012, j'utilise le compteur sur la colonne d'index primaire afin d'avoir un identificateur unique, ce qui est un standard il me semble.

    Je constate que le compteur qui est configuré pour un incrément de 1, à quelques reprises, saute un grand nombre d'unités et ce sans raison apparente.

    Par exemple, sur la colonne primaire d'une table d'abonnements avec compteur incrément de une unité, la création d'un nouvel enregistrement passe de l'ID 2784 à 3783, puis le compteur continue normalement.

    Cela arrive sur 2 applications différentes et sur différents sites.

    Si cela, dans l'immédiat, ne pose pas de problème majeur, puisque l'intégrité des données entre les tables et respectée, ce problème non expliqué me pose question et m'inquiète quand à un saut d'incrément trop fréquent ou trop important.

    Merci de votre aide.

    mercredi 2 juillet 2014 15:35

Réponses

Toutes les réponses

  • Bonjour

    Il n'y a pas aucune garantie que tous les valeurs dans les colonnes prennent des valeurs successives.
    Les transactions finies par un rollback laissent un tel trou.
    Aussi, on ne doit pas oublier les delete qui peuvent intervenir.
    Si vous voulez recycler les valeurs non utilisez-vous devez créer votre propre mécanisme (qui ne sera pas très simple).
    Mais sera plus simple de changer l’ int en bigint ou utiliser des GUIDS.

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 3 juillet 2014 07:36
    Modérateur
  • Merci de votre réponse,

    L'utilisation d'une colonne d'index primaire est également prévue comme no. de référence d'un client, d'une facture, etc ... Dès lors un "trou" entre des no de factures, par exemple, peut-être ennuyeux. A l'époque j'utilisai plutôt la base de données Sybase SqlAnywhere et je n'ai jamais connu tel problème, l'incrémentation de une unité était toujours respectée. Il est clair que la suppression d'un enregistrement n'entraine pas le remplacement de la clé supprimée.

    Dans la pratique, est-ce que l'ajout des instructions BEGIN TRANSACTION et COMMIT TRANSACTION comme défini dans le code suivant, optimise les chances d'avoir une incrémentation de une unité respectée ?

    Merci de votre aide et meilleures salutations. Pierre

    
                // Insert Command
                this.oSqlDataAdapter.InsertCommand = new SqlCommand("BEGIN TRANSACTION; Insert Into Yoga.Invoices (CreateDate, CustomerID) Values (@CreateDate, @CustomerID); " +
                "COMMIT TRANSACTION; Select Top 1 InvoiceID From Yoga.Invoices Order By InvoiceID DESC", Program.oConnect);
                this.oSqlDataAdapter.InsertCommand.Parameters.Add("@CreateDate", SqlDbType.Date);
                this.oSqlDataAdapter.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.Int);
    

     

    mardi 8 juillet 2014 11:33
  • Bonjour

    Il n'y a pas aucun changement si vous utilisez BEGIN TRAN - ROLLBACK TRAN.
    Ici vous avez une autre possible cause (et solution) du problème :

    Identity column value suddenly jumps to 1001 in sql server

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Gruninger mardi 8 juillet 2014 13:08
    mardi 8 juillet 2014 12:17
    Modérateur
  • Extra,

    Merci de votre rapide réponse, le lien indiqué apporte des réponses intéressantes à ma question.

    Bonne après-midi et meilleures salutations.Pierre

    mardi 8 juillet 2014 13:08