C#中利用SQLite事务快速批量插入测试数据

沈亦白
沈亦白
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍在C#环境下如何利用SQLite的事务功能高效批量插入测试数据。通过封装单条SQL指令并在事务块内循环执行,可避免频繁磁盘I/O,从而大幅提升百万级数据的写入速度。

性能痛点与解决方案

在向SQLite数据库进行大规模数据导入(如生成测试集)时,如果每次ExecuteNonQuery都自动提交,数据库引擎必须频繁刷新日志和写入磁盘,导致速度极慢。解决方案是显式开启一个SQLiteTransaction,将所有插入操作包裹在事务中,仅在最后统一提交,从而将数千或数百万次的I/O操作合并为一次。

实现步骤

第1步:初始化定时器并建立连接上下文

首先创建Stopwatch实例用于精确测量耗时,并准备数据库连接对象。确保在执行插入前连接处于打开状态。

第2步:开启事务并定义SQL模板

调用db_con.BeginTransaction()启动事务。为了提升代码可读性并防止SQL注入风险(尽管测试数据可控),建议使用参数化查询或安全的字符串格式化方法。示例中使用了string.Format构造INSERT语句,并对特殊字符(如单引号)进行了转义处理。

第3步:循环执行插入指令

遍历待插入的数据源,依次设置cmd.CommandText并执行ExecuteNonQuery。在此过程中,可以添加简单的逻辑来统计已处理的行数,并定期输出控制台进度,以便直观感受性能差异。

 var stopwatch = new Stopwatch();
      using (var cmd = new SQLiteCommand(db_con))
      using (var transaction = db_con.BeginTransaction())
      {
        stopwatch.Reset();
        stopwatch.Start();
        foreach (var item in sorted)
        {
          // 注意:实际生产中推荐使用 parameters.AddWithValue 防注入
          sql = string.Format("insert into db (st1, st2) values ('{0}', {1})", item.Key.Replace("'", "''"), item.Value);
          cmd.CommandText = sql;
          cmd.ExecuteNonQuery();
          ++readCnt;
          
          // 每处理100万条输出一次进度
          if (++readCnt % 1000000 == 0)
          {
            Console.Write("\rDumped {0} lines...", readCnt);
          }
        }
        
        // 准备提交
        Console.Write("\rCommitting....");
        transaction.Commit();
        stopwatch.Stop();
        
        // 输出最终耗时
        Console.Write("\rDumped {0} lines using {1} seconds...", readCnt, stopwatch.Elapsed.TotalSeconds);
      }

第4步:提交事务并验证结果

当循环结束后,调用transaction.Commit()确认所有更改持久化到数据库。随后停止计时器,计算总耗时。此时数据库中的表应包含所有插入的记录,且整个过程通常比非事务方式快几个数量级。

完成判断

程序运行无异常抛出,控制台显示预期的行数和秒数,且数据库中对应的数据表行数与预期一致,即表示批量插入成功。

简要总结

对于需要大量写入SQLite的场景,务必使用SQLiteTransaction。它通过将多个写操作原子化提交,极大地减少了数据库的日志同步次数,是C#中进行数据压测和初始化的最佳实践之一。 以上就是C#/.Net 中快速批量给SQLite数据库插入测试数据的详细内容,更多关于C#数据库优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表