首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite DataAdapter UpdateBatchSize错误

SQLite DataAdapter UpdateBatchSize错误
EN

Stack Overflow用户
提问于 2012-06-29 03:00:54
回答 2查看 2K关注 0票数 0

背景:

我正在尝试将DataTable复制到SQLite数据库。与在SQLServer数据库上运行的等效数据集相比,SQLite版本所需的时间大约长5倍。为了简化这一过程,我尝试使用SQLiteDataAdapter的UpdateBatchSize属性来启用批处理。

问题:

但是,任何设置该值的尝试都会导致System.NotSupportedException。如何正确设置该值?请参见代码:

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-29 22:27:20

同样的性能提升可以通过另一种方法实现。不要试图修改UpdateBatchSize,而是创建一个包含更新的SQLiteTransaction。

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2012-08-25 00:18:50

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

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

创建显式事务解决了性能问题的原因是,如果不在事务内执行sqlite操作,则每个sql语句都会隐式创建一个。这使得它花费的时间要长得多,假设它必须为每条语句做文件锁定和日志记录以及各种事情。因此,在使用SQLite时,您应该始终显式地创建事务,这将使您的性能比不创建事务的性能提高一个数量级。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11251205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档