C#一次删除数据库中的多个数据

时间:2019-12-12 21:38:23

标签: c# .net winforms

我正在尝试创建一个循环,该循环将同时从数据库中删除数据。

这是我的代码。

using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
{
    foreach (DataGridViewRow dr in bunifuCustomDataGrid1.Rows)
    {
        int inventid = Convert.ToInt32(bunifuCustomDataGrid1.Rows[bunifuCustomDataGrid1.CurrentRow.Index].Cells[0].Value);

        mysqlCon.Open();
        MySqlCommand cmd = new MySqlCommand("DELETE FROM bookdb.book WHERE (BookID = @uid)", mysqlCon);
        cmd.Parameters.AddWithValue("uid", inventid);

        cmd.ExecuteNonQuery();

        mysqlCon.Close();
        GridFill();
    }
}

MessageBox.Show("DOne");

我可以删除多个记录,但是如果顺序和混乱就可以删除。 我希望有人能帮助我。

///////////////////////////////////////////////// /////////

我在下面尝试了一些答案。这是几乎对我有用的代码。

        using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
        {
            mysqlCon.Open();
            var tr = mysqlCon.BeginTransaction();

            foreach (DataGridViewRow dr in bunifuCustomDataGrid1.Rows)
            {

                var cmd = new MySqlCommand("DELETE FROM bookdb.book WHERE (BookID = @uid)");
                cmd.Connection = mysqlCon;
                cmd.Transaction = tr;
                cmd.Parameters.AddWithValue("@uid", dr.Cells["BookID"].Value ?? DBNull.Value);
                cmd.ExecuteNonQuery();
            }

            tr.Commit();
            mysqlCon.Close();

            //////////////////////////
        }

        MessageBox.Show("DOne");
        GridFill();

        ////
        ///

问题在于它删除了所有行。

3 个答案:

答案 0 :(得分:2)

使用一笔交易发送一批ExecuteNonQuery

mysqlCon.Open();
var tr = mysqlCon.BeginTransaction();

foreach (...)
{
    var cmd = new MySqlCommand();
    cmd.Connection = mysqlCon ;
    cmd.Transaction = tr;

     ...
    cmd.ExecuteNonQuery();
}

tr.Commit();
mysqlCon.Close();

答案 1 :(得分:1)

根据您当前的代码,这似乎是一种简单的方法,即迭代单元格并立即从gridview中获取所有id,然后将它们发送到要删除的数据库中。

        using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
        {
            IEnumerable<int> ids = bunifuCustomDataGrid1
                .Rows[bunifuCustomDataGrid1.CurrentRow.Index]
                .Cells
                .Select(x => Convert.ToInt32(x.Value));

            string sql = $"DELETE FROM bookdb.book WHERE BookID IN ({string.Join(", ", ids)})";

            mysqlCon.Open();
            MySqlCommand cmd = new MySqlCommand(sql, mysqlCon);

            cmd.ExecuteNonQuery();

            mysqlCon.Close();
            GridFill();
        }

        MessageBox.Show("DOne");

答案 2 :(得分:1)

您可以采用不同的查询结构来一次删除所有内容:

DELETE FROM bookdb.book WHERE BookID IN (bookid1, bookid2, bookid3, ...)

尽管有时有时会导致传递大量SQL查询。

按照先前的回答,最好的解决方案是使用数据绑定并在所有项目都标记为删除后调用update方法;这相当于删除交易中的所有内容。