在这段代码中,我有一个按钮点击事件。每当我第一次点击按钮时,代码都能正常工作。但是,如果我在其他时间点击按钮,则会抛出错误。
我的代码是
private void button2_Click(object sender, EventArgs e)
{
string itemname = comboBox1.SelectedItem.ToString();
con.Open();
command.CommandText = "DELETE FROM pricedata WHERE Item=@item";
command.Connection = con;
command.Parameters.AddWithValue("@item", itemname);
command.ExecuteNonQuery();
con.Close();
}
答案 0 :(得分:6)
您似乎尝试第二次将@item
参数添加到您的命令中,这就是您收到错误的原因;
喂!您的命令已经此命名参数。你无法添加 命令的命名参数相同。那没有意义。
例如,在执行命令之前,可以使用.Clear()
方法清除命令参数。
command.Parameters.Clear();
command.Parameters.AddWithValue("@item", itemname);
当然,不要使用AddWithValue
方法。 It may generate unexpected results sometimes。使用.Add()
重载来指定参数类型和大小。最好使用using
statement自动调整SqlCeConnection
和SqlCeCommand
,而不是手动调用Close
或Dispose
方法。并且本地连接总是更可取的。最好尽可能接近使用来打开和关闭连接。 ADO.NET将执行connection pooling,因此这根本不会很昂贵。
private void button2_Click(object sender, EventArgs e)
{
using(var con = new SqlCeConnection(conString))
using(var command = con.CreateCommand())
{
command.CommandText = "DELETE FROM pricedata WHERE Item = @item";
command.Parameters.Clear();
command.Parameters.AddWithValue("@item", comboBox1.SelectedItem.ToString());
con.Open();
command.ExecuteNonQuery();
}
}
答案 1 :(得分:0)
您的连接对象是此方法的外部,全局。只是缩短它的寿命,使其成为本地:
conn.Open();
command = new SqlCeCommand();
command.Connection = conn;
...
command.Dispose();