2012-12-13 36 views
0

我將多個項目插入到表格中,基於從下拉列表中的選擇。當我從下拉一個項目下來,然後一切工作正常,但是當我選擇多個項目,然後我得到這個錯誤變量名稱'@VarName'已被聲明問題

The variable name '@CompName' has already been declared. Variable names must be unique within a query batch or stored procedure. 

我到底做錯了什麼?在這裏感謝 是我的代碼

protected void DV_Test_ItemInserting(object sender, DetailsViewInsertEventArgs e) 
    { 
     foreach (ListItem listItem in cblCustomerList.Items) 
     { 
      if (listItem.Selected) 
      { 
       string Name= listItem.Value; 
       sqlcon.Open(); 
       string CompName= ((TextBox)DV_Test.FindControl("txtCompName")).Text.ToString(); 
       string Num = ((TextBox)DV_Test.FindControl("txtNum")).Text.ToString(); 
       SqlCommand cmd = new SqlCommand("select CompNamefrom MyTable where CompName= '" + CompName+ "' and Num = '" + Num + "' and Name= '" + Name+ "' ", sqlcon); 
       SqlDataReader dr = cmd.ExecuteReader(); 
       if (dr.Read()) 
       { 
        lblmsg.Text = "Not Valid"; 
       } 
       else 
       { 
        dr.Close(); 

        sqlcmd.CommandText = "INSERT INTO MyTable(CompName, Num, Name) VALUES(@CompName, @Num, @Name)"; 
        sqlcmd.Parameters.Add("@CompName", SqlDbType.VarChar).Value = CompName; 
        sqlcmd.Parameters.Add("@Num", SqlDbType.VarChar).Value = Num; 
        sqlcmd.Connection = sqlcon;     
        sqlcmd.ExecuteNonQuery(); 
        DV_Test.ChangeMode(DetailsViewMode.Insert); 
        sqlcon.Close(); 
       } 
       sqlcon.Close();    
      } 

     } 
} 
+2

您還應該清理您的輸入並在該select語句中使用參數。 – MikeSmithDev

回答

5

您正在將通過循環每次paramters @CompName@Num到您的查詢。

您需要將呼叫轉移到Add外循環並使用以下步驟更新:

sqlcmd.Parameters["@CompName"].Value = CompName; 
sqlcmd.Parameters["@Num"].Value = Num; 

所以,你的代碼就變成了:

sqlcmd.CommandText = "INSERT INTO MyTable(CompName, Num, Name) VALUES(@CompName, @Num, @Name)"; 
sqlcmd.Parameters.Add("@CompName", SqlDbType.VarChar); 
sqlcmd.Parameters.Add("@Num", SqlDbType.VarChar); 

foreach (ListItem listItem in cblCustomerList.Items) 
{ 
    if (....) 
    { 
     .... 
    } 
    else 
    { 
     dr.Close(); 

     sqlcmd.Parameters["@CompName"].Value = CompName; 
     sqlcmd.Parameters["@Num"].Value = Num; 
     sqlcmd.Connection = sqlcon;     
     sqlcmd.ExecuteNonQuery(); 
     DV_Test.ChangeMode(DetailsViewMode.Insert); 
     sqlcon.Close(); 
    } 

} 
+0

謝謝。我使用這樣的清除函數修復它:DS.SelectParameters.Clear(); – user1858332

2

我在這裏的假設是因爲你宣佈sqlcmd以外的循環範圍;所以當您迭代它時,您可能會多次添加相同的參數名稱。

請注意請修復此行:SqlCommand cmd = new SqlCommand("select CompNamefrom MyTable where CompName= '" + CompName+ "' and Num = '" + Num + "' and Name= '" + Name+ "' ", sqlcon);,因爲它的SQL注入正在等待發生。

+0

+1解決安全問題。 – MikeSmithDev

4

在最後加上sqlcmd.Parameters.Clear();。這樣每個參數在每個循環結束時都不會存在。

例子:

// ... 
sqlcmd.CommandText = "INSERT INTO MyTable(CompName, Num, Name) VALUES(@CompName, @Num, @Name)"; 
        sqlcmd.Parameters.Add("@CompName", SqlDbType.VarChar).Value = CompName; 
        sqlcmd.Parameters.Add("@Num", SqlDbType.VarChar).Value = Num; 
        sqlcmd.Connection = sqlcon;     
        sqlcmd.ExecuteNonQuery(); 
        DV_Test.ChangeMode(DetailsViewMode.Insert); 
        sqlcon.Close(); 
        sqlcmd.Parameters.Clear(); 
//... 
1

只需補充一點:

SqlCmd.Parameters.Clear(); 

在你的代碼,參數相加之前。它將清除已經添加的參數列表並將您的參數視爲新的參數。