插入到 SQL 数据库中,在带有复选框列表的每个数据库中

本文关键字:数据库 列表 复选框 SQL 插入 | 更新日期: 2023-09-27 18:34:08

我有这个,并在另一个插入中创建了一个范围标识,使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

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

插入到 SQL 数据库中,在带有复选框列表的每个数据库中

不能多次向命令添加相同的参数。您可以在每次迭代结束时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 语句自动释放连接和命令,而不是手动调用CloseDispose方法。

地方

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

在 foreach 块之前和

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

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

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