C# BULK INSERT导入大数据文件数据到SqlServer

server/2025/3/26 23:00:30/
BULK INSERT 的核心原理

BULK INSERT 是一种通过数据库原生接口高效批量导入数据的技术,其核心原理是绕过逐条插入的 SQL 解析和执行开销,直接将数据以二进制流或批量记录的形式传输到数据库。
在.NET中,主要通过 ​SqlBulkCopy 类​(针对 SQL Server)或 ORM 框架(如 SqlSugar、EF)封装的高效方法实现

NET 中调用 BULK INSERT 的常见方式
  1. 直接执行 T-SQL 命令
    在 .NET 中可通过 SqlCommand 执行 BULK INSERT 语句,但需确保数据文件路径对 SQL Server 可见(如共享目录或服务器本地路径):
using (SqlConnection conn = new SqlConnection(connectionString))
{conn.Open();string sql = @"BULK INSERT MyTable FROM 'C:\data.csv' with(FIRSTROW=2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', MAXERRORS=1000)";SqlCommand cmd = new SqlCommand(sql, conn);cmd.ExecuteNonQuery();
}

注意:需授予 SQL Server 服务账户对数据文件的读取权限。

  1. 使用 SqlBulkCopy 类
    .NET 提供 SqlBulkCopy 类,直接从内存数据(如 DataTable 或 IDataReader)批量导入,无需依赖物理文件:
using (var connection = new SqlConnection(connectionString)) 
{connection.Open();using (var bulkCopy = new SqlBulkCopy(connection)) {bulkCopy.DestinationTableName = "Customers";bulkCopy.BatchSize = 1000;  // 每批次插入量,优化内存与性能bulkCopy.BulkCopyTimeout = 600;  // 超时时间(秒)// 列映射(解决字段名不一致问题)bulkCopy.ColumnMappings.Add("Id", "CustomerId");bulkCopy.ColumnMappings.Add("Name", "CustomerName");// 数据转换为 DataTable 或直接读取 IDataReadervar dataTable = ConvertToDataTable(customers);bulkCopy.WriteToServer(dataTable);}
}

优势:
客户端处理:无需将数据写入临时文件。
灵活映射:通过 ColumnMappings 处理列顺序不一致问题

  1. ORM 框架的批量操作
    ​Entity Framework (EF):
    使用 AddRange + SaveChanges 实现小批量插入,但超大数据量需依赖第三方库(如 EF Core 的 BulkExtensions)或切换至原生 SqlBulkCopy。
    ​SqlSugar:
    提供 Fastest().BulkCopy() 方法,底层封装数据库最佳批量 API(如 SQL Server 的 SqlBulkCopy),简化代码并支持分页处理
db.Fastest<Order>().PageSize(100000).BulkCopy(dataList);
关键参数与优化策略
  1. 性能优化
    批处理大小(BATCHSIZE)
    设置合理的 BATCHSIZE(如 5000-10000 行)以平衡内存占用与事务提交频率6。
    表锁(TABLOCK)
    添加 WITH (TABLOCK) 减少锁竞争,提升并发导入效率。
    禁用约束与触发器
    默认情况下 BULK INSERT 忽略约束检查,可通过 CHECK_CONSTRAINTS 和 FIRE_TRIGGERS 按需启用。

  2. 错误处理
    容错机制
    设置 MAXERRORS 参数允许部分数据失败(如 MAXERRORS = 100),避免整体操作中断。
    错误日志
    通过 ERRORFILE 指定错误文件路径,记录导入失败的行及原因

在这里插入图片描述

常见问题与解决方案
  1. 权限不足
    确保 SQL Server 服务账户有文件读取权限。
    使用 SqlBulkCopy 避免文件路径依赖36。

  2. 数据类型不匹配
    使用格式文件(FORMATFILE)显式定义列类型。
    在 SqlBulkCopy 中预处理数据确保与目标表结构一致。

  3. 性能瓶颈
    分批次提交(BATCHSIZE)减少事务日志压力。
    禁用索引和触发器,导入完成后重建。

总结

在 .NET 中实现高效批量数据导入时:

  1. 优先选择 SqlBulkCopy:适用于客户端数据源,无需处理文件权限。
  2. BULK INSERT 补充场景:适合服务器端已有标准化数据文件的定期导入。
  3. 优化核心参数:合理设置批处理大小、锁机制及错误容忍度,结合业务需求选择编码与格式控制策略
文章来源:https://blog.csdn.net/Marzlam/article/details/146470244
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/179049.html

相关文章

【QA】Qt中直接渲染和离屏渲染效率哪个高?

直接渲染和离屏渲染的效率取决于具体场景和实现方式&#xff0c;以下是详细对比分析&#xff1a; 一、直接渲染&#xff08;On-screen Rendering&#xff09; 原理 直接将图形数据绘制到屏幕缓冲区&#xff08;Back Buffer&#xff09;&#xff0c;完成后通过交换缓冲区显示…

嵌入式驱动开发方向的基础强化学习计划

基础强化阶段 以下是针对嵌入式驱动开发方向的基础强化阶段详细计划&#xff0c;结合大厂技术需求与您的学习目标&#xff0c;提供量化成果、行动指南及学习路线&#xff1a; --- 一、基础强化阶段核心目标 1. 技术能力 - 掌握C语言核心语法与系统编程&#xff08;指针、内…

19.哈希表的实现

1.哈希的概念 哈希(hash)⼜称散列&#xff0c;是⼀种组织数据的⽅式。从译名来看&#xff0c;有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系&#xff0c;查找时通过这个哈希函数计算出Key存储的位置&#xff0c;进⾏快速查找。 1.2.直接定址法…

人工智能之数学基础:特征值和特征向量

本文重点 在线性代数中,我们经常使用到的一个概念就是特征值和特征向量,在机器学习中,尤其是图像领域,这个概念尤为的重要,一个矩阵可以对向量进行加工,从而将一个向量变成新的向量。有的时候,一个向量经过矩阵加工之后,新生成的向量与原来的向量共线(方向可能相反)…

【2025】基于python+flask的篮球交流社区平台设计与实现(源码、万字文档、图文修改、调试答疑)

基于 PythonFlask 的篮球交流社区平台设计与实现 系统功能结构图如下&#xff1a; 一、课题背景 篮球作为一项广受欢迎的运动&#xff0c;拥有庞大的爱好者群体。随着互联网的发展&#xff0c;越来越多的篮球爱好者希望有一个在线平台&#xff0c;能够方便地获取篮球赛事信息、…

GitHub 上的 Khoj 项目:打造你的专属 AI 第二大脑

在信息爆炸的时代&#xff0c;高效管理和利用个人知识变得愈发重要。GitHub 上的 Khoj 项目为我们提供了一个强大的解决方案&#xff0c;它能成为你的 “AI 第二大脑”&#xff0c;帮你轻松整合、搜索和运用知识。今天&#xff0c;就来详细了解下 Khoj。​ Khoj 是什么&#x…

《BUG生存指南》(有芝士的小说)

《BUG生存指南》 “叮咚&#xff01;” 小张的手机响了&#xff0c;他抬头看了一眼&#xff0c;是一条来自“程序员自救互助群”的消息&#xff1a; 【紧急通知&#xff1a;今晚午夜12点&#xff0c;所有未解决的BUG将实体化&#xff0c;威胁程序员安全。请及时修复代码&#…

什么是跳表?(Skip List)

跳表&#xff08;Skip List&#xff09;完整讲解 跳表是一种基于链表的有序数据结构&#xff0c;通过多层索引提高查找速度。它的核心思想是&#xff1a;“用多个层级的索引来加速查找”&#xff0c;从而达到类似二分查找的效果&#xff0c;同时保留链表的动态性。 1. 跳表的基…