插入SQL数据库,在foreach中使用复选框列表

时间:2016-02-11 12:43:33

标签: c# sql foreach sql-insert

我有这个,并在另一个使int id变量

的插入上创建了一个范围标识
foreach (ListItem item in CheckBoxList1.Items)
{
    if (item.Selected)
    {
        int CheckId = Convert.ToInt32(item.Value);
        cmd.CommandText = "INSERT INTO FarveTilCykel (fk_cy_id, fk_farve_id) VALUES (@cy, @farve)";

        cmd.Parameters.Add("@cy", SqlDbType.VarChar).Value = id;
        cmd.Parameters.Add("@farve", SqlDbType.VarChar).Value = CheckId;

        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
    } //end if
} //end foreach

问题是(我认为),当它已经运行了一次并且第二次运行时,@cy已经被声明,我怎样才能使它每次都不同?

3 个答案:

答案 0 :(得分:4)

不能多次向命令添加相同的参数。您可以在每次迭代结束时Clear参数;

foreach (ListItem item in CheckBoxList1.Items)
{
   ...
   ...
   cmd.Parameters.Clear();
}

或者更好的是,在foreach之前定义参数, 在其中添加/更改其值。

var parameter1 = new SqlParameter("@cy", SqlDbType.VarChar);
var parameter2 = new SqlParameter("@farve", SqlDbType.VarChar);    
cmd.Parameters.Add(parameter1);
cmd.Parameters.Add(parameter2);

foreach (ListItem item in CheckBoxList1.Items)
{
   ...
   ...
   cmd.Parameters["@cy"].Value = id;
   cmd.Parameters["@farve"].Value = CheckId;
}

还可以使用using statement自动处理您的连接和命令,而不是手动调用CloseDispose方法。

答案 1 :(得分:1)

地方

var p1 = cmd.Parameters.Add("@cy", SqlDbType.VarChar);
var p2 = cmd.Parameters.Add("@farve", SqlDbType.VarChar);

在foreach块和

之前
p1.Value = id;
p2.Value = CheckId;

在块内而不是2个当前行。

答案 2 :(得分:1)

我更喜欢打开连接(conn)一次,然后在using语句中写入,然后清除每条记录的参数(cmd)。