背景:
我正在尝试将DataTable复制到SQLite数据库。与在SQLServer数据库上运行的等效数据集相比,SQLite版本需要大约5倍的时间。为了简化这一点,我试图使用我正在使用的SQLiteDataAdapter的UpdateBatchSize属性来启用批处理。
问题:
但是,任何设置值的尝试都会导致System.NotSupportedException。你如何正确设定这个价值?见代码:
public int InsertDataTable(DataTable dt, string selectCommand)
{
SQLiteDataAdapter myAdapter = new SQLiteDataAdapter(selectCommand, m_conn);
myAdapter.UpdateBatchSize = 0;
int rowsAffected = myAdapter.Update(dt.Select());
return rowsAffected;
}
答案 0 :(得分:1)
UpdateBatchSize的目的是在将SQL语句发送到数据库服务器之前将它们组合在一起。在SQLite中,您不需要这样做,因为没有网络连接:您正在使用直接文件访问。这可能就是为什么你得到一个错误,大概是驱动程序意识到它没有对该设置做任何事情所以它会出错。
如果您正在使用SQL Server,那么将该设置增加到2意味着它将两个UPDATE语句组合在一起并发送它们,而不是一次发送一个。将其设置为更大的数字意味着减少到服务器的往返次数。因此,如果您使用的是SQL Server,则需要将其设置为更大的数字,以减少网络延迟的影响。将其设置为0意味着每批次的语句数量没有限制,但这可能意味着您的批次非常愚蠢。
创建显式事务解决性能问题的原因是,如果不在事务内执行sqlite操作,则每个sql语句隐式创建一个。这使得它需要更长的时间,大概它必须为每个语句执行文件锁定和日志记录以及各种操作。因此,在使用SQLite时,您应该始终显式创建事务,这将比不这样做提供一个数量级的改进。
答案 1 :(得分:0)
通过另一种方法可以实现相同的性能提升。而不是尝试修改UpdateBatchSize,创建一个包含更新的SQLiteTransaction。
public int InsertDataTable(DataTable dt, string selectCommand)
{
SQLiteDataAdapter adapter = new SQLiteDataAdapter(selectCommand, m_conn);
SQLiteCommandBuilder builder = new SQLiteCommandBuilder(adapter);
SQLiteTransaction transaction = m_conn.BeginTransaction();
builder.GetInsertCommand().Transaction = transaction;
int rowsAffected = adapter.Update(dt.Select());
transaction.Commit();
return rowsAffected;
}
来源: