我有这个,并在另一个使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
已经被声明,我怎样才能使它每次都不同?
答案 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自动处理您的连接和命令,而不是手动调用Close
或Dispose
方法。
答案 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)。