前言
MySqlDataAdapter的Update方法不仅仅能够做到更新,还可以删除,添加,查看MySql支持C#的.dll库,会发现其实很多东西都继承实现了微软的那一套。
因为在更改数据时会读到内存中,例如用DataTable存储 1,那么DataTable只是数据的副本。只要保证目标参数中的DataTable的行的状态对应增加、删除、更新等 2 就可以实现想要的结果 。
通过调用SetAdded、Delete、SetModied等方法也可以改变DataTable行增删改状态,而MySqlDataAdapter的Update方法就根据行的状态去更新表,Added的就插入,Deleted的就删除、Modified的就更新。
需要注意的是,假如你希望删除掉一行数据,并且在调用Update方法后能够在数据库中更新删除掉对应的行,那就 不能调用Remove方法,其是直接从DataTable中删除记录,而不是将行的DataRowState变更为Deleted,想要实现上述操作,应调用Delete方法。而且在调用Update方法之前不能调用 AcceptChanges, 调用AcceptChangs方法后,所有 DataRowState不为Unchanged的行将被修改为Unchanged。
正文
批量更新方法
public static int MultiUpateData(DataTable dtInfor)
{
if (string.IsNullOrEmpty(dtInfor.TableName))
{
throw new Exception("DataTable.TableName is NULL.");
}
if (dtInfor.Rows.Count == 0)
{
return -1;
}
string sqlStr = string.Format("SELECT * FROM {0} WHERE FALSE", dtInfor.TableName);
using (MySqlConnection con = new MySqlConnection(MySqlConnectString))
{
using (MySqlCommand cmd = new MySqlCommand(sqlStr, con))
{
con.Open();
MySqlTransaction transction = con.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
int count = 0;
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(cmd);
dataAdapter.SelectCommand = new MySqlCommand(sqlStr, con);
MySqlCommandBuilder builder = new MySqlCommandBuilder(dataAdapter);
builder.ConflictOption = ConflictOption.OverwriteChanges;
builder.SetAllValues = true;
count = dataAdapter.Update(dtInfor);
transction.Commit();
dtInfor.AcceptChanges();
dataAdapter.Dispose();
builder.Dispose();
return count;
}
catch (Exception)
{
transction.Rollback();
throw;
}
}
}
}