我正在尝试创建一个循环,该循环将同时从数据库中删除数据。
这是我的代码。
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();
////
///
问题在于它删除了所有行。
答案 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方法;这相当于删除交易中的所有内容。