2012-12-21 3 views
1

Possible en double:
The variable name ‘@VarName’ has already been declared Issuesql en boucle

using (SqlCommand command = connection.CreateCommand()) 
{ 
    int j = 1; 
    for (int i = 0; i < temp4.Count; i++) 
    { 
     #region idsetter 

     int prevId = 0; 

     command.CommandText = "SELECT MAX(id) FROM Configuration"; 
     connection.Open(); 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       if (reader[0].ToString() != "") 
       { 
        prevId = Int32.Parse(reader[0].ToString()); 
       } 
       else 
       { 
        prevId = 0; 
       } 
      } 
     } 

     connection.Close(); 
     int currId = prevId + 1; 
     #endregion 
     command.CommandText = "INSERT INTO Configuration (id,A, B, C, D, E, F,G) " + 
           "VALUES (@id, @a, @b , @c, @d, @e, @f, @g)"; 

     command.Parameters.AddWithValue("@id", currId); 
     command.Parameters.AddWithValue("@a", myL); 
     command.Parameters.AddWithValue("@b", pipi); 
     command.Parameters.AddWithValue("@c", temp4[i].ad); 
     command.Parameters.AddWithValue("@d", temp4[i].asa); 
     command.Parameters.AddWithValue("@e", temp4[i].Tasa); 
     command.Parameters.AddWithValue("@f", j); 
     command.Parameters.AddWithValue("@g", 1); 
     connection.Open(); 
     command.ExecuteNonQuery(); 
     connection.Close(); 
     j++; 
     if (j > 7) 
     { 
      j = 1; 
     } 
    } 
} 

Je tente d'écrire dans la configuration Tableau première lecture id et incrémenter puis écrire tout le reste. Mais lorsque la seconde entrée est ajoutée, elle donne l'exception

Le nom de variable "@id" a déjà été déclaré. Les noms de variable doivent être uniques dans un lot de requêtes ou une procédure stockée.

Comment éviter cette exception?

+1

Je suis environ 84% sûr que une fois que vous avez défini 'CommandText' une fois, vous n'avez pas besoin de le redéfinir; vous pouvez simplement continuer à réutiliser l'instruction avec différents paramètres. Vous pouvez avoir deux instructions et les configurer en dehors de la boucle, afin de s'assurer qu'elles ne sont pas recompilées à chaque fois. Ce n'est pas une affaire énorme, mais vous pourriez aussi bien profiter des avantages des déclarations préparées ... :) – cHao

Répondre

2

Vous devez effacer vos paramètres de commande à chaque itération de votre boucle.

command.CommandText = "INSERT INTO Configuration (id,A, B, C, D, E, F,G) VALUES (@id, @a, @b , @c, @d, @e, @f, @g)"; 

command.Parameters.Clear(); 
command.Parameters.AddWithValue("@id", currId); 
+0

solution plus petite et simple – murmansk

4

À l'heure actuelle, le paramètre de votre première requête est en conflit avec un paramètre de votre deuxième requête. Utilisez une nouvelle commande pour chaque exécution.

0

Vous ajoutez plusieurs fois @id et tous vos autres paramètres à la collecte de paramètres. Vous devez d'abord effacer la collection, puis ajouter le nouvel enregistrement.

Vous devriez pouvoir utiliser la méthode clear. Clear parameter collection

command.Parameters.Clear(); 
6

Si vous ajoutez le même paramètre à chaque fois, il vous donnera toujours une exception.

Déclarez les variables juste avant pour la boucle et de leur donner une valeur par défaut comme:

command.Parameters.AddWithValue("@id", 1); 
command.Parameters.AddWithValue("@a", ""); 
command.Parameters.AddWithValue("@b", ""); 
command.Parameters.AddWithValue("@c", ""); 
command.Parameters.AddWithValue("@d", ""); 
command.Parameters.AddWithValue("@e", ""); 
command.Parameters.AddWithValue("@f", 1); 
command.Parameters.AddWithValue("@g", 1); 

puis modifiez la valeur des paramètres après command.CommandText = "INSERT INTO Configuration (id,A, B, C, D, E, F,G) VALUES (@id, @a, @b , @c, @d, @e, @f, @g)"; comme

cmd.Parameters["@id"].Value=currId; 
cmd.Parameters["@a"].Value=myL; 
cmd.Parameters["@b"].Value=pipi; 
cmd.Parameters["@c"].Value=temp4[i].ad; 
cmd.Parameters["@d"].Value=temp4[i].asa; 
cmd.Parameters["@e"].Value=temp4[i].Tasa; 
cmd.Parameters["@f"].Value=j; 
cmd.Parameters["@g"].Value=1;