变量名’@VarName’已被声明为Issue
我根据下拉列表中的选择将多个项目插入表中。 当我从下拉列表中选择一个项目时,一切正常,但是当我选择多个项目时,我会收到此错误
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(); } } }
您每次通过循环时都会将参数@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(); } }
添加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(); //...
我的假设是因为你已经将sqlcmd
声明为循环范围之外; 因此,当您对其进行迭代时,您可能会多次添加相同的参数名称。
请请修改此行: SqlCommand cmd = new SqlCommand("select CompNamefrom MyTable where CompName= '" + CompName+ "' and Num = '" + Num + "' and Name= '" + Name+ "' ", sqlcon);
因为它是SQL注入等待发生。
只需添加:
SqlCmd.Parameters.Clear();
在代码中,在添加参数之前。 它将清除已添加的参数列表并将您的参数视为新参数。