IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Insertion avec un autoincrement


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Points : 20
    Points
    20
    Par défaut Insertion avec un autoincrement
    Bonsoir,j'aimerais bien mettre dans mon code ASP C# un code pour incrementer le champ de mon formulaire par la veleur max(id)+1 apres chaque insertion d'un nouveau enregistrement,sachant que j'ai déja le code d'insertion par les requetes preparées :
    SqlConnection MaSqlCnx = new SqlConnection("Data Source=Local;Initial Catalog=annuaire;Integrated Security=True");
    Cnx.Open();
    SqlParameter id = new SqlParameter("@id", SqlDbType.Int);
    SqlParameter nom = new SqlParameter("@nom", SqlDbType.VarChar,100);
    String sql = string.Format("INSERT INTO contact(id, nom) VALUES({0},{1})",
    _id.ParameterName, _nom.ParameterName);
    SqlCommand cmd = new SqlCommand(sql.ToString(),Cnx);
    //Ajout des paramètres à la commande
    cmd.Parameters.Add(_id);
    cmd.Parameters.Add(_nom);

    cmd.ExecuteNonQuery();
    Cnx.Close();
    Nb:le champ que je veux mettre en autoincrement c'est le champ id,il doit s'incrementer par une valeure de select(max(id)+1),merci bien pour vos contributions!!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    quand tu as un champ défini comme autoincrement dans la BDD, normalement tu ne précises pas sa valeur à l'insertion...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO contact(nom) VALUES({0})
    Le SGBD se charge de renseigner la valeur de id
    Pour récupérer la valeur du dernier id inséré, ça dépend du SGBD... je me rappelle plus ce que c'est pour SQL Server

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par tomlev Voir le message
    quand tu as un champ défini comme autoincrement dans la BDD, normalement tu ne précises pas sa valeur à l'insertion...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO contact(nom) VALUES({0})
    Le SGBD se charge de renseigner la valeur de id
    Pour récupérer la valeur du dernier id inséré, ça dépend du SGBD... je me rappelle plus ce que c'est pour SQL Server
    Pour SQL Server moi j'avais utiliser un truc dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO CLIENT VALUES(...); SELECT @@IDENTITY AS ID
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    bonjour,merci mes chers amis pour vos réponses,permettez moi de vous rappeler que je dois faire mon code d'autoincrementation au niveau de mon code metier,j'ai commencé à faire des truc mais j'ai un problème de conversion de valeur :
    int max=int.Parse("select Max(cod)+1 from annuaire");
    SqlCommand cmd_max = new SqlCommand(max.ToString(), Cnx);
    cmd_max.ExecuteNonQuery();
    _id.Value = max;
    j'ai un probleme de conversion entre string et int,si vous pouvez m'aidez à résoudre ce problème!!

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Merci d'utiliser la balise code () afin de faire un post plus lisible

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Salut,

    D'abord:
    C'est plus lisible.

    Ensuite, je trouve que c'est dommage de gérer l'incrémentation dans le code métier alors que la plupart des SGBD savent gérer ça proprement... d'un point de vue design, c'est pas terrible...

    Enfin:
    int max=int.Parse("select Max(cod)+1 from annuaire");
    SqlCommand cmd_max = new SqlCommand(max.ToString(), Cnx);

    J'ai comme l'impression que tu n'as rien compris à ce que tu faisais...
    - int.Parse renvoie un entier à partir de sa représentation en texte. Je n'ai pas vraiment l'impression que "select Max(cod)+1 from annuaire" représente un entier... son résultat peut-être
    - ensuite tu utilises max comme requête SQL, alors que c'est un entier ! Ce n'est pas parce que tu fais ToString que ça va magiquement se transformer en requête...
    - ExecuteNonQuery sert à exécuter une commande SQL qui n'est pas une requête (i.e. pas un SELECT), et justement en l'occurrence c'est un SELECT... Il faut utiliser ExecuteReader (si tu attends plusieurs lignes et/ou plusieurs colonnes) ou ExecuteScalar (si tu attends une seule valeur).

    Bref, la logique est complètement fausse. Voilà qui serait mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SqlCommand cmd_max = new SqlCommand("select Max(cod)+1 from annuaire", Cnx);
    int max= (int) cmd_max.ExecuteScalar();
    _id.Value = max;

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    Ok pourquoi pas faire comme ca.
    Alors effectivement, je n'avais jamais vu cette façon de faire.
    Pourquoi ne peux tu pas utiliser le autoincrement de SqlServer ? (ou autre)
    Sinon le code donnée dans le dernier message est le bon, mais cela te fera deux accès DB juste pour un bête insert. Si tu dois faire cela avec chaque objet que tu veux insérer, vive la performance.

    Fix

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    Re,merci mes collegues,c'est bon j'ai trouvé la bonne route en utilisant les sqldatareader,je stock le résultat dans mon datareader aprés je le parcours ensuite je recupère la valeur!!
    merci bien!!!

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    ok, tag résolu alors

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par ASPAK Voir le message
    Re,merci mes collegues,c'est bon j'ai trouvé la bonne route en utilisant les sqldatareader,je stock le résultat dans mon datareader aprés je le parcours ensuite je recupère la valeur!!
    merci bien!!!
    un datareader ça sert à rien ici... il vaut mieux utiliser ExecuteScalar, vu que tu n'as qu'une valeur à récupérer

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    Re,merci Tomlev,non c'est bon ca marche trés trés bien,je l'ai essayé ,merci pour toi ,voila la partie du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     SqlDataReader dr_DataReader;
            string max = "select Max(cod)+1 from contact";
            SqlCommand command = new SqlCommand(max.ToString(), Cnx);
            dr_DataReader = command.ExecuteReader();
            if (dr_DataReader.HasRows)
            {
                dr_DataReader.Read();
                Adresse.Value = dr_DataReader.GetValue(0).ToString();
            }
            dr_DataReader.Close();
    Bonne journée

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    on se doute que cela fonctionne
    On dit juste qu'il y a une autre solution qui est bcp moins lourde et plus correcte en dev.

    C'était juste une autre proposition.

    Tu peux mettre le Tag Résolu.

    Fix

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu fais comme tu veux, mais bon, c'est pas la peine de sortir l'artillerie lourde à mon avis... en utilisant ExecuteScalar plutôt que ExecuteReader, tu peux faire la même chose avec 6 lignes de code en moins. Et fonctionnellemment ça se justifie mieux vu que la requête n'est pas supposée renvoyer plus d'une valeur.

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par ASPAK Voir le message
    Re,merci Tomlev,non c'est bon ca marche trés trés bien,je l'ai essayé ,merci pour toi ,voila la partie du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     SqlDataReader dr_DataReader;
            string max = "select Max(cod)+1 from contact";
            SqlCommand command = new SqlCommand(max.ToString(), Cnx);
            dr_DataReader = command.ExecuteReader();
            if (dr_DataReader.HasRows)
            {
                dr_DataReader.Read();
                Adresse.Value = dr_DataReader.GetValue(0).ToString();
            }
            dr_DataReader.Close();
    Bonne journée
    Il ne te dis pas que ça marcherait pas ... Il te dit que c'est plus aproprié d'utiliser ExecuteScalar puisque ta requête ne renvoie qu'un entier ...
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. SQL insertion avec champ autoIncrement
    Par sg-40 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 09/11/2005, 11h28
  3. insertion d'un autoincrement
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/03/2004, 09h43
  4. INSERT avec procédure stockée / Clef de type AutoInc
    Par bgdelphi dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/10/2003, 18h30
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo