SQLite DataAdapter UpdateBatchSize错误

时间:2012-06-28 19:00:54

标签: c# sqlite dataadapter

背景:

我正在尝试将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;
}

2 个答案:

答案 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;
    }

来源:

SQLiteTransction