C# 错误:变量名'@规定';已经申报了

C# 错误:变量名'@规定';已经申报了,c#,winforms,sql-server-2005,C#,Winforms,Sql Server 2005,我的表单中有一个选中列表框,文本框和组合框。我得到了这个错误:- The variable name '@Provision' has already been declared. Variable names must be unique within a query batch or stored procedure. Must declare the scalar variable "@BloodGroup". 当我没有为我的checkedlistbox使用for循环时,它工作得很好。使

我的表单中有一个
选中列表框
文本框
组合框
。我得到了这个错误:-

The variable name '@Provision' has already been declared. Variable names must be unique within a query batch or stored procedure.
Must declare the scalar variable "@BloodGroup".
当我没有为我的
checkedlistbox
使用for循环时,它工作得很好。使用for循环时,my
组合框
BloodGroup
出错

string insert = "INSERT INTO Employee(EmpID, EmpName, Address, Provision, BloodGroup) VALUES (@EmpID, @EmpName, @Address, @Provision, @BloodGroup)";

SqlCommand comm = new SqlCommand(insert, sqlCon);

comm.Parameters.AddWithValue("@EmpID", SqlDbType.Int).Value = txtEmpID.Text;
comm.Parameters.AddWithValue("@EmpName", SqlDbType.VarChar).Value = txtName.Text;
comm.Parameters.AddWithValue("@Address", SqlDbType.Text).Value = txtAdd.Text;

for (int a = 0; a < chkProvision.Items.Count; a++)
{
    if (chkProvision.GetItemChecked(a))
        comm.Parameters.AddWithValue("@Provision", SqlDbType.Char).Value = chkProvision.Items[a].ToString();
    else
        comm.Parameters.AddWithValue("@Provision", "");
}          

if (cbBlood.SelectedValue == null)
    comm.Parameters.AddWithValue("@BloodGroup", "");
else
    comm.Parameters.AddWithValue("@BloodGroup", SqlDbType.Char).Value = cbBlood.SelectedItem.ToString();

comm.ExecuteNonQuery();
你有

for (int a = 0; a < chkProvision.Items.Count; a++)
{
    if (chkProvision.GetItemChecked(a))
        comm.Parameters.AddWithValue("@Provision", SqlDbType.Char).Value = chkProvision.Items[a].ToString();
    else
        comm.Parameters.AddWithValue("@Provision", "");
}     
for(int a=0;a
因此,倾向于多次添加
@规定。
这是不可能的

查询引擎必须唯一标识每个必须更新的列,因此不能在同一参数化查询中多次使用同一列

如果每个项目有多个准备金,因此您需要使用不同准备金的多行,那么您必须多次执行查询:每个准备金类型一次。或者,在服务器上创建一个storedprocedure,您可以在其中传递主记录和与之相关联的供应列表,SP完成这些工作。

for (int a = 0; a < chkProvision.Items.Count; a++)
{
    if (chkProvision.GetItemChecked(a))
        comm.Parameters.AddWithValue("@Provision", SqlDbType.Char).Value = chkProvision.Items[a].ToString();
    else
        comm.Parameters.AddWithValue("@Provision", "");
}     
for(int a=0;a
因此,倾向于多次添加
@规定。
这是不可能的

查询引擎必须唯一标识每个必须更新的列,因此不能在同一参数化查询中多次使用同一列


如果每个项目有多个准备金,因此您需要使用不同准备金的多行,那么您必须多次执行查询:每个准备金类型一次。或者,在服务器上创建一个storedprocedure,您在其中传递主记录和与之相关联的供应列表,SP执行这些操作。

如果
chkProvision
有多个选定的项目,您实际要做什么?添加多行?什么版本的SQL Server?(实际上,您的架构似乎是错误的。如果员工可以有多个,则应该有另一个带有
EmpID,Provision
的表。顺便说一句:在字符串末尾插入值,一个逗号不带参数是,抱歉..键入错误我使用的是SQL Server 2005。chkProvision会将checkeditems保存在一列中。您实际在尝试什么如果
chkProvision
有多个选定项,该怎么办?添加多行?以及SQL Server的哪个版本?(实际上,您的架构似乎是错误的。如果员工可以有多个,则应该有另一个带有
EmpID,Provision
的表。顺便说一句:在字符串末尾插入值,一个逗号不带参数是,抱歉..键入错误我使用的是SQL Server 2005。chkProvision将在一列中保存checkeditems。)