Sqlite批量插入速度慢的解决方法小计
写了个保存数据的方法,一共500多条数据,用了一分钟还多,代码如下:
/// <summary>
/// 保存DataTable
/// </summary>
/// <param name="dt">datatable</param>
/// <returns>影响的行数</returns>
public int SaveDataTable(DataTable dt)
{
try
{
DbDataAdapter adapter = _dbProviderFactory.CreateDataAdapter();
string sql = string.Format(@"select * from {0} where 1=2", dt.TableName);
DbCommand cmd = _dbProviderFactory.CreateCommand();
DbCommandBuilder comBuilder = _dbProviderFactory.CreateCommandBuilder();
comBuilder.DataAdapter = adapter;
cmd.CommandText = sql;
cmd.Connection = _con;
adapter.SelectCommand = cmd;
adapter.InsertCommand = comBuilder.GetInsertCommand();
adapter.UpdateCommand = comBuilder.GetUpdateCommand();
adapter.DeleteCommand = comBuilder.GetDeleteCommand();
_con.Open();
int result = adapter.Update(dt);
return result;
}
catch (Exception ex)
{
throw new Exception("保存DataTable出错:" + ex.Message);
}
finally
{
_con.Close();
}
后来在一篇博客(http://zhiwei.li/text/2010/08/sqlite%E6%8F%92%E5%85%A5%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/)里发现了问题的解决方法,原来sqlite在每执行一次insert操作时都开启一次事务,在sqlite官网上的解释如下:Because it does not have a central server to coordinate access, SQLite must close and reopen the database file, and thus invalidate its cache, for each transaction. In this test, each SQL statement is a separate transaction so the database file must be opened and closed and the cache must be .......
后来将代码修改如下就OK了:
/// <summary>
/// 保存DataTable
/// </summary>
/// <param name="dt">datatable</param>
/// <returns>影响的行数</returns>
public int SaveDataTable(DataTable dt)
{
try
{
DbDataAdapter adapter = _dbProviderFactory.CreateDataAdapter();
string sql = string.Format(@"select * from {0} where 1=2", dt.TableName);
DbCommand cmd = _dbProviderFactory.CreateCommand();
DbCommandBuilder comBuilder = _dbProviderFactory.CreateCommandBuilder();
comBuilder.DataAdapter = adapter;
cmd.CommandText = sql;
cmd.Connection = _con;
adapter.SelectCommand = cmd;
adapter.InsertCommand = comBuilder.GetInsertCommand();
adapter.UpdateCommand = comBuilder.GetUpdateCommand();
adapter.DeleteCommand = comBuilder.GetDeleteCommand();
_con.Open();
_tran = _con.BeginTransaction();//transaction begin 传说中sqlite每执行一条insert语句都开启一个事务,死慢
cmd.Transaction = _tran;
int result = adapter.Update(dt);
_tran.Commit();//transaction end
return result;
}
catch (Exception ex)
{
_tran.Rollback();
throw new Exception("保存DataTable出错:" + ex.Message);
}
finally
{
_con.Close();
}
}
希望遇到相同问题的园友可以看见这篇随笔。
欢迎转载,转载请注明出处

浙公网安备 33010602011771号