【问题标题】:SQLite DataAdapter UpdateBatchSize ErrorSQLite DataAdapter UpdateBatchSize 错误
【发布时间】:2012-06-30 08:39:13
【问题描述】:

背景:

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

【问题讨论】:

  • 另外:由于这是我的第一个问题,任何对格式/提问的批评/建议将不胜感激。
  • 连接 m_conn 是否在任何地方启动?
  • 是的,它已经初始化了。初始化行是: using (SQLiteConnection conn = new SQLiteConnection(string.Format("Data Source={0}", file))) 我需要在该初始化行中设置触发器吗?
  • 你可以尝试手动设置UpdateBatchSize > 1,而不是0,看看它是否有效
  • 不幸的是,这会导致同样的错误。

标签: c# sqlite dataadapter


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    同样的性能提升可以通过另一种方法来实现。与其尝试修改 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

    【讨论】:

    • 如果有人知道为什么其他方法不起作用,我们将不胜感激。
    • 如果您不在事务中执行 sqlite 操作,那么每个 sql 语句都会隐式创建一个。这使得它需要更长的时间,我想它必须为每个语句做各种文件锁定事情。因此,在使用 SQLite 时,您应该始终明确地创建事务。
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多