Requete INSERT en c# avec SqlServer [Résolu]

yahou29 44 Messages postés lundi 7 avril 2008Date d'inscription 24 janvier 2010 Dernière intervention - 30 avril 2008 à 19:39 - Dernière réponse : yahou29 44 Messages postés lundi 7 avril 2008Date d'inscription 24 janvier 2010 Dernière intervention
- 1 mai 2008 à 11:55
Bonjour à tous,

Je suis depuis 2 jour sur un simple requete qui ne fonctionne pas...
Message d'erreur :
Violation de la contrainte PRIMARY KEY 'PK_ELEVE'. Impossible d'insérer une clé en double dans l'objet 'dbo.ELEVE'.
L'instruction a été arrêtée.

La PK est ELV_NUM .
Elle est automatiquement ajoutée au formulaire via un requete SELECT , donc pas de double.

Une bonne nouvelle quand même l'insert fonctionne puisque le nouveau tuple apparait dans ma table de la BDD.

Voici le code :

bool eleve;

private

bool SaisiesCorrectes(
out
String mess)   {
                  if (textBoxNewId.Text "" || textBoxNewNom.Text "" || textBoxNewPrenom.Text "" || textBoxNewGenre.Text "" ||                textBoxNewIdClasse.Text "" || textBoxNewDnais.Text
"JJ/MM/AAAA" || textBoxNewDentr.Text ==
"JJ/MM/AAAA" )                         {
                              mess =

"Vous êtes priés de remplir tous les champs ";

                              return
false;
                         }                    mess =

"";

                    return
true;
}

private

void button1_Click(
object sender,
EventArgs e){

// Ajout

// vérifier la conformité des données

String chaineTest;

if (SaisiesCorrectes(
out chaineTest)){

// confirmer l'ajout

if (
MessageBox.Show(
"Confirmez-vous l'ajout de cet élève ?",
"",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question) ==
DialogResult.Yes){

if (eleve){

SqlCommand cmd =
new
SqlCommand(
"insert into ELEVE ( elv_num , cls_ci , elv_nom , elv_prn , elv_genre , elv_dnais , elv_dentr ) values ( @elv_num , @cls_ci , @elv_nom , @elv_prn , @elv_genre , @elv_dnais , @elv_dentr )", sqlConnection1);cmd.Parameters.Add(

"@ELV_NUM",
SqlDbType.SmallInt);cmd.Parameters.Add(

"@ELV_NOM",
SqlDbType.VarChar);cmd.Parameters.Add(

"@ELV_PRN",
SqlDbType.VarChar);cmd.Parameters.Add(

"@CLS_CI",
SqlDbType.VarChar);cmd.Parameters.Add(

"@ELV_GENRE",
SqlDbType.VarChar);cmd.Parameters.Add(

"@ELV_DNAIS",
SqlDbType.DateTime);cmd.Parameters.Add(

"@ELV_DENTR",
SqlDbType
.DateTime);

cmd.Parameters[ "@ELV_NUM"
].Value = textBoxNewId.Text;cmd.Parameters[

"@ELV_NOM"].Value = textBoxNewNom.Text;cmd.Parameters[

"@ELV_PRN"].Value = textBoxNewPrenom.Text;cmd.Parameters[

"@CLS_CI"].Value = textBoxNewIdClasse.Text;cmd.Parameters[

"@ELV_GENRE"].Value = textBoxNewGenre.Text;cmd.Parameters[

"@ELV_DNAIS"].Value = textBoxNewDnais.Text;cmd.Parameters[

"@ELV_DENTR"].Value = textBoxNewDentr.Text;

// Méthode précédente ne fonctionnant pas non plus

/* cmd.Parameters.Add("@ELV_NUM",Convert.ToInt32(textBoxNewId.Text));cmd.Parameters.Add("@ELV_NOM",Convert.ToString(textBoxNewNom.Text));

cmd.Parameters.Add("@ELV_PRN",Convert.ToString(textBoxNewPrenom.Text));

cmd.Parameters.Add("@CLS_CI",Convert.ToString(textBoxNewIdClasse.Text));

cmd.Parameters.Add("@ELV_GENRE",Convert.ToString(textBoxNewGenre.Text));

cmd.Parameters.Add("@ELV_DNAIS",Convert.ToDateTime(textBoxNewDnais.Text));

cmd.Parameters.Add("@ELV_DENTR",Convert.ToDateTime(textBoxNewDentr.Text)); */

 

// Déclaration du SqlDataAdaptater et du dataset

SqlDataAdapter dacmd;

DataSet dscmd;

// ouvrir la connexionsqlConnection1.Open();

dacmd =

new
SqlDataAdapter(cmd);dscmd =

new
DataSet();dacmd.Fill(dscmd);

cmd.ExecuteNonQuery();

// Fermeture de la connexionsqlConnection1.Close();

}

}

}

}

private
void Form1_Load(
object sender,
EventArgs e){

eleve =

true;

// Affichage automatique de l'Id de l'élève# region

Affichage auto Id futur Eleve

// Déclaration du SqlDataAdaptater et du dataset

SqlDataAdapter da;

DataSet ds;

// Ouverture de la connexionsqlConnection1.Open();

// Chargement des données

SqlCommand req =
new
SqlCommand(
"SELECT max(ELV_NUM) + 1 FROM ELEVE", sqlConnection1);da =

new
SqlDataAdapter(req);ds =

new
DataSet();da.Fill(ds);

// affichage dans la TextBoxtextBoxNewId.Text = req.ExecuteScalar().ToString();

// Fermeture de la ConnexionsqlConnection1.Close();

# endregion

}

}

Désolé pour le mauvais copier/coller...
Merci pour votre aide.
Afficher la suite 

5 réponses

Répondre au sujet
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 1 mai 2008 à 00:34
+3
Utile
Salut,

La requête est executée 2 fois :
dacmd = new SqlDataAdapter(cmd); // hu ? la requête INSERT en tant que commande Select ?
...
dacmd.Fill(dscmd); // Première execution
cmd.ExecuteNonQuery(); // Seconde execution avec le même ID

Sinon à part ça, une base de donnée est un environnement à fort accès concurent, ta méthode de génération de l'identifiant unique est vouée à l'échec : tu ne peux pas ici garantir que personne ne va commencer la création d'un élève entre le moment où le premier utilisateur obtient l'ID de l'élève suivant et le moment où il execute la requête INSERT (surtout vu la façon dont tu l'obtient à l'ouverture du formulaire).
La définition d'IDENTITY sur la colonne serait peut être plus judicieux, ou a défaut voir pour une génération plus sécurisée de l'ID.

/*
coq
MVP Visual C#
CoqBlog
*/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
yahou29 44 Messages postés lundi 7 avril 2008Date d'inscription 24 janvier 2010 Dernière intervention - 30 avril 2008 à 19:43
0
Utile
un oubli : le message d'erreur mets en surbrillance la ligne  " cmd.ExecuteNonQuery(); "
Commenter la réponse de yahou29
yahou29 44 Messages postés lundi 7 avril 2008Date d'inscription 24 janvier 2010 Dernière intervention - 1 mai 2008 à 01:38
0
Utile
Ah bah vi j'aurai pas du mettre un Fill....

J'ai bien compris le problème avec l'identifiant mais je ne vois pas la solution avec IDENTITY. Je verrai ca demain.

Et merci pour cette reponse rapide.
Commenter la réponse de yahou29
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 1 mai 2008 à 08:48
0
Utile
C'est la spécification de clé autoincrémentée, c'est le serveur qui se charge de l'opération à l'execution de la requête INSERT.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
yahou29 44 Messages postés lundi 7 avril 2008Date d'inscription 24 janvier 2010 Dernière intervention - 1 mai 2008 à 11:55
0
Utile
ok, merci.

Je ne peux pas refaire la base.( serveur école )
Mais dès que j'ai finis, je vais tester ça.

Encore merci.
Commenter la réponse de yahou29

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.