2012-12-21 101 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;