2013-05-16 6 views
0

Chaque fois que j'insère un enregistrement dans ma base de données, l'enregistrement est ajouté trois fois.Le même enregistrement est inséré plusieurs fois

try 
{ 
    con.Open(); 

    object addedkey = cmd.ExecuteScalar(); 

    if ((addedkey != null && (addedkey != DBNull.Value))) 
    { 
     addedkey = Convert.ToInt32(cmd.ExecuteScalar()); 
    } 

    added = cmd.ExecuteNonQuery(); 

    lblResult.Text = added.ToString() + " record opgeslagen."; 
    lblResult.Text = addedkey.ToString(); 
} 

Mais quand je commente sur ExecuteScalar et ExecuteNonQuery tout fonctionne bien. Donc, si je commente l'un des deux, l'enregistrement sera inséré deux fois.

Cela a commencé à se produire après avoir ajouté un bouton de suppression, ce qui n'a rien à voir avec la commande d'insertion.

Est-ce que quelqu'un sait ce qui cause cela?

Merci d'avance. :)

+5

Il semble que vous exécutez la commande trois fois. – criticalfix

+0

pouvez-vous poster votre méthode cmd.executenonquery, à partir de votre code j'ai l'impression que vous remplacerez ces fonctions selon les besoins personnalisés. – Alok

Répondre

4

Vous exécutez votre insertion chaque fois que vous exécutez une méthode 'Execute ...()' sur la commande. Vous l'exécutez trois fois dans votre code, vous insérez donc 3x enregistrements.

object addedkey = cmd.ExecuteScalar(); //you run the insert command here 
    if ((addedkey != null && (addedkey != DBNull.Value))) 
    { 
     addedkey = Convert.ToInt32(cmd.ExecuteScalar());//you run the insert command here 
    } 
    added = cmd.ExecuteNonQuery();//you run the insert command here 
    lblResult.Text = added.ToString() + " record opgeslagen."; 
    lblResult.Text = addedkey.ToString(); 
+0

Je n'avais pas ce problème avant d'ajouter du code pour une commande de suppression ailleurs. –

+0

pouvez-vous poster la requête que vous utilisez? – jle

+0

insertion de chaîneSQL; insertSQL = "INSERER dans Deelnemer ("; insertSQL + = "Naam, Tussenvoegsel, Achternaam)"; insertSQL + = "VALEURS ("; insertSQL + = "@Naam, @Tussenvoegsel, @Achternaam); SELECT scope_identity();"; –

0

Vous exécutez 3 fois. Donc vraiment, vous devez refactoriser le code après la première exécution.

Vous pouvez modifier

addedkey = Convert.ToInt32(cmd.ExecuteScalar()); 

à cette question - cela empêchera la 2ème exécution:

addedkey = Convert.ToInt32(addedKey); 

et changer ceci:

added = cmd.ExecuteNonQuery(); 

à cette question - cela empêchera la 3ème exécution (ceci suppose que added est un int, et d'être le retour de votre exécution.)

added = addedKey; 

Si added est en fait un boolean puis mettez-le dans votre if car elle aura été validée par votre déclaration if

IE

{ 
    addedkey = Convert.ToInt32(addedKey);//you run the insert command here 
    added = true; 
} 
+0

Mon professeur m'a dit d'utiliser executescalar pour obtenir l'identité de l'enregistrement que j'ai ajouté, et executenonquery pour afficher les lignes affectées, que je dois ensuite afficher sur l'étiquette. Donc 'ajouté' est les lignes affectées et 'addedkey' est l'identité de l'enregistrement que vous venez de créer. –

+0

Ensuite, vous devez modifier votre instruction select. Cela doit retourner un ID, donc en supposant que votre retour val est appelé '@ id', ajoutez" 'SELECT @id = SCOPE_IDENTITY()' "à votre instruction SQL. – Darren

Questions connexes