第一种方法,将要更新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)也是执行一次事务,这两种方法应该是一样的原理,是这样的么?

解决方案 »

  1.   

    所有的更新语句可以合并条件么?比如
    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)
      

  2.   

    dataAdpter.Update(datatable) 就是循环调用 UpdateCommand.ExecuteNonQuery,原理是一样的。
    都是基本ADO.NET操作的包装。
      

  3.   

    dataAdpter.Update(datatable)可以批处理,效率高些
      

  4.   


    补充一下:循环时对于RowState.NoChanged的行会直接跳过,如果是Changed就调用UpdateCommand,如果是Add,则调用InsertCommand,然后将影响的行数累加,最终返回