如何从C#中删除Access数据库

时间:2017-06-28 18:30:31

标签: c#

我正在尝试添加将从访问db文件中的2个表中删除的代码。有时其中一个会起作用而另一个不会当我以另一种方式尝试它会做相反的事情。所以最终只有2个作品中的一个。

这是我的代码,我希望有人能发现我做错了。

try
{
    Conn.Open();
    OleDbCommand command = new OleDbCommand();
    command.Connection = Conn;
    command.CommandText = "DELETE FROM TBLNAME WHERE name =@name";
    command.Parameters.AddWithValue("@name", lvlist.SelectedItems[0].Text);
    command.ExecuteNonQuery();

    command.CommandText = "DELETE from TBLNAME WHERE cb_listName =@listname";
    command.Parameters.AddWithValue("@listname", lvlist.SelectedItems[0].Text);
    command.ExecuteNonQuery();
    Conn.Close();
}
catch (Exception ex)
{
    MessageBox.Show("Error  " + ex);
}

2 个答案:

答案 0 :(得分:3)

您应该使用不同的Command实例,每个命令要执行一个命令。如果不这样做,则需要清除参数。这是因为OleDb查询中的参数是位置的而不是命名的。这意味着当您在第二个查询中添加第二个参数时,将使用第一个参数,因为它是列表中的第一个参数。

using(var connection = new OleDbConnection("connection string here"))
{
    connection.Open();
    using(var command = new OleDbCommand("DELETE FROM TBLNAME WHERE name = @name", connection))
    {
        cmd.Parameters.Add(new OleDbParameter("@name", OleDbType.VarChar, 50)).Value = lvlist.SelectedItems[0].Text;
        command.ExecuteNonQuery();
    }

    using(var command = new OleDbCommand("DELETE from TBLNAME WHERE cb_listName = @listname", connection))
    {
        cmd.Parameters.Add(new OleDbParameter("@listname", OleDbType.VarChar, 50)).Value = lvlist.SelectedItems[0].Text;
        command.ExecuteNonQuery();
    }
}

你也应该:

  1. 使用using块确保连接在使用后关闭。不要尝试创建类范围的,甚至更糟的全局连接实例。
  2. 您还应该为参数指定db类型,不要使用AddwithValue
  3. 如果可能,还要指定db类型的长度,如果您有varchar类型,可以在上面这样做。 注意我猜测这些列的架构长度
  4. 最后,只是关于一般最佳做法的说明,不要添加对该例外无用的catch块。至少记录类型,消息和堆栈跟踪,然后对属性InnerException中找到的每个内部异常以递归方式重复此操作。这些有用的信息可以帮助您确定异常发生的确切原因。

答案 1 :(得分:1)

使用两个不同的OleDbCommand对象。