Requete INSERT en c# avec SqlServer

Résolu
yahou29 Messages postés 44 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 janvier 2010 - 30 avril 2008 à 19:39
yahou29 Messages postés 44 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 janvier 2010 - 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.

5 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 mai 2008 à 00:34
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
*/
3
yahou29 Messages postés 44 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 janvier 2010
30 avril 2008 à 19:43
un oubli : le message d'erreur mets en surbrillance la ligne  " cmd.ExecuteNonQuery(); "
0
yahou29 Messages postés 44 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 janvier 2010
1 mai 2008 à 01:38
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.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 mai 2008 à 08:48
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
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yahou29 Messages postés 44 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 janvier 2010
1 mai 2008 à 11:55
ok, merci.

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

Encore merci.
0
Rejoignez-nous