第一种方法,将要更新sql语句保存到一个数组中,然后执行事务,这是网上的代码:
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static void ExecuteSqlTran(ArrayList SQLStringList)
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
SQLiteTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n].ToString();
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (System.Data.SQLite.SQLiteException E)
{
tx.Rollback();
throw new Exception(E.Message);
}
}
}
还有就是将要更新的数据保存到临时的datatable中,然后dataAdpter.Update(datatable)。我个人的感觉是dataAdpter.Update(datatable)也是执行一次事务,这两种方法应该是一样的原理,是这样的么?
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static void ExecuteSqlTran(ArrayList SQLStringList)
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
SQLiteTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n].ToString();
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (System.Data.SQLite.SQLiteException E)
{
tx.Rollback();
throw new Exception(E.Message);
}
}
}
还有就是将要更新的数据保存到临时的datatable中,然后dataAdpter.Update(datatable)。我个人的感觉是dataAdpter.Update(datatable)也是执行一次事务,这两种方法应该是一样的原理,是这样的么?
update table1 set col1 = 'aa' where id = 1
update table1 set col1 = 'aa' where id = 2可以合并为
update table1 set col1 = 'aa' where id in (1, 2)
都是基本ADO.NET操作的包装。
补充一下:循环时对于RowState.NoChanged的行会直接跳过,如果是Changed就调用UpdateCommand,如果是Add,则调用InsertCommand,然后将影响的行数累加,最终返回