此名称的SqlCeParameter已包含在此SqlCeParameterCollection中。错误

时间:2015-05-16 11:46:49

标签: c# sql-server-ce

在这段代码中,我有一个按钮点击事件。每当我第一次点击按钮时,代码都能正常工作。但是,如果我在其他时间点击按钮,则会抛出错误。

我的代码是

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();
}

2 个答案:

答案 0 :(得分:6)

您似乎尝试第二次将@item参数添加到您的命令中,这就是您收到错误的原因;

  

喂!您的命令已经此命名参数。你无法添加   命令的命名参数相同。那没有意义。

例如,在执行命令之前,可以使用.Clear()方法清除命令参数。

command.Parameters.Clear();
command.Parameters.AddWithValue("@item", itemname);

当然,不要使用AddWithValue方法。 It may generate unexpected results sometimes。使用.Add()重载来指定参数类型和大小。最好使用using statement自动调整SqlCeConnectionSqlCeCommand,而不是手动调用CloseDispose方法。并且本地连接总是更可取的。最好尽可能接近使用来打开和关闭连接。 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();