2012-12-21 59 views
1

可能重复:
The variable name ‘@VarName’ has already been declared IssueSQL在for循环

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; 
     } 
    } 
} 

我试图在配置表写一读ID和递增它,然后写一切。但是,当添加第二个条目时,它会给出例外

变量名称“@id”已被声明。变量名称 在查询批处理或存储过程中必须是唯一的。

如何避免此异常任何解决?

+1

我敢肯定,约84%改变参数的值一旦你设置了一次'CommandText',你就不需要重新设置了;你可以继续重复使用不同参数的语句。您可能希望有两条语句并在循环外部设置它们,以确保它们不会每次都重新编译。这不是一个很大的交易,但你不妨利用准备好的陈述的好处... :) – cHao

回答

2

您需要在循环的每次迭代中清除您的Command参数。

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

更小的ans简单解决方案 – murmansk

4

现在,第一个查询的参数与第二个查询的参数冲突。每次执行都使用一个新命令。

0

您正在向参数集合多次添加@id和所有其他参数。您需要先清除收集,然后添加新记录。

您应该可以使用clear方法。 Clear parameter collection

command.Parameters.Clear(); 
6

如果每次添加相同的参数,它总会给你一个例外。之前

声明变量for循环,让他们像一些默认值:

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); 

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

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;