0

背景:

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

2 回答 2

1

UpdateBatchSize 的目的是在将 SQL 语句通过线路发送到数据库服务器之前将它们组合在一起。在 SQLite 中,您不需要这样做,因为没有网络连接:您使用的是直接文件访问。这可能就是您收到错误的原因,大概是驱动程序意识到它对该设置没有做任何事情,所以它出错了。

如果您使用的是 SQL Server,那么将该设置增加到 2 意味着它将两个 UPDATE 语句组合在一起并发送它们,而不是一次发送一个。将其设置为更大的数字意味着与服务器的往返次数更少。因此,如果您使用 SQL Server,您可以将其设置为更大的数字,以减少网络延迟的影响。将其设置为 0 意味着每个批次的语句数量没有限制,但这可能意味着您的批次非常大。

创建显式事务解决了您的性能问题的原因是,如果您不在事务中执行 sqlite 操作,那么每个 sql 语句都会隐式创建一个。这使得它需要更长的时间,大概它必须为每个语句执行文件锁定和日志记录以及各种事情。因此,在使用 SQLite 时,您应该始终明确地创建事务,这将使您比不这样做有一个数量级的改进。

于 2012-08-24T16:18:50.233 回答
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;
    }

来源:

SQLite 事务

于 2012-06-29T14:27:19.517 回答