当前位置:

首页 > 编程开发 > c#如何批量插入数据_c#批量插入数据完整教程与实战案例

c#如何批量插入数据_c#批量插入数据完整教程与实战案例

C# 万级数据批量插入:SqlBulkCopy 实战精要 在C#中进行大规模数据插入,性能是首要考量。当数据量达到万级甚至更高时,常规的逐条插入方法会迅速成为性能瓶颈。那么,有没有一种既高效又稳定的解决方案呢?答案是肯定的。 用 SqlBulkCopy 实现高速批量插入 开门见山地说,在C#生态中,

本文目录

    C# 万级数据批量插入:SqlBulkCopy 实战精要

    c#如何批量插入数据_c#批量插入数据完整教程与实战案例

    在C#中进行大规模数据插入,性能是首要考量。当数据量达到万级甚至更高时,常规的逐条插入方法会迅速成为性能瓶颈。那么,有没有一种既高效又稳定的解决方案呢?答案是肯定的。

    用 SqlBulkCopy 实现高速批量插入

    开门见山地说,在C#生态中,处理万级以上数据批量插入任务,SqlBulkCopy几乎是唯一正确的选择。它的工作原理是绕过了SQL语句的解析层,直接利用SQL Server的原生批量加载协议。这种“走后门”的方式,带来的性能提升是数量级的——通常能达到普通INSERT INTO ... VALUES循环操作的10到50倍。

    一个常见的性能误区是试图用ExecuteNonQuery配合参数化INSERT循环来模拟批量操作。结果往往是,插入一万条数据可能需要耗时30秒以上。而同样的数据量,交给SqlBulkCopy处理,通常在300毫秒内就能完成。这个差距,足以决定一个功能的体验是“流畅”还是“卡顿”。

    在实际使用时,有几个关键点需要把握:

    • 适用范围:SqlBulkCopy是SQL Server(包括Azure SQL)的“亲儿子”,专为其优化。它不适用于MySQL、PostgreSQL等其他数据库。
    • 前置条件:目标表必须已经存在。SqlBulkCopy只管插入,不会自动建表,也不会对字段映射做智能校验——映射错了,它要么静默跳过,要么直接报错。
    • 数据源选择:推荐使用DataTable或IDataReader作为数据源。尽量避免直接传递IEnumerable,因为这会触发完整的枚举和反射过程,反而会拖累性能。
    • 核心配置:BatchSize(批次大小,建议在1000到10000之间)、DestinationTableName(目标表名,务必使用全名如[dbo].[Orders])、EnableStreaming = true(处理海量数据时启用,能有效减少内存占用)。

    DataTable 构造时字段顺序与类型必须严格匹配目标表

    这是新手最容易栽跟头的地方:代码运行不报错,但数据就是插不进去;或者数值被截断了,日期变成了1900-01-01。问题的根源,十有八九是DataTable的列顺序或数据类型与数据库表结构没有严格对齐。

    举个例子,假设目标表是这样定义的:

    CREATE TABLE Orders (
        Id INT IDENTITY(1,1) PRIMARY KEY,
        OrderNo NVARCHAR(20) NOT NULL,
        Amount DECIMAL(18,2),
        CreatedAt DATETIME2
    )

    那么,对应的DataTable就必须严格按照这个顺序来添加列,并且数据类型要兼容:

    var dt = new DataTable();
    dt.Columns.Add("OrderNo", typeof(string));      // 注意:第一列不是“Id”
    dt.Columns.Add("Amount", typeof(decimal));
    dt.Columns.Add("CreatedAt", typeof(DateTime));  // 这里不能用 DateTime? 或 string

    还有一个细节:如果数据库表中的某个字段允许为NULL,那么DataTable中对应列的AllowDBNull属性也必须设为true。否则,SqlBulkCopy会抛出InvalidOperationException异常。

    处理主键冲突:用临时表 + MERGE 替代直接插入

    SqlBulkCopy本身的设计哲学是“高速写入”,因此它不支持类似ON CONFLICT或IGNORE这样的冲突处理逻辑。一旦遇到主键或唯一键重复,它会直接报错并中断整个操作。但在真实的业务场景中,“存在则更新,不存在则插入”的需求非常普遍。

    这时,一个经典的解决方案是分两步走:

    • 第一步,暂存数据:先用SqlBulkCopy将数据高速导入一个结构相同的临时表(例如#staging_orders)。
    • 第二步,合并数据:再执行一条T-SQL的MERGE语句,将临时表中的数据智能地合并到正式表中。

    下面是一个典型的MERGE语句示例:

    MERGE Orders AS tgt
    USING #staging_orders AS src
    ON tgt.OrderNo = src.OrderNo
    WHEN MATCHED THEN
        UPDATE SET Amount = src.Amount, CreatedAt = src.CreatedAt
    WHEN NOT MATCHED THEN
        INSERT (OrderNo, Amount, CreatedAt) VALUES (src.OrderNo, src.Amount, src.CreatedAt);

    需要注意的是,以#为前缀的临时表是会话级别的,会话结束后会自动清理,无需手动删除。如果需要在多个数据库连接间共享临时数据,可以使用##前缀的全局临时表,但必须特别注意并发安全问题。

    异步与事务控制:BulkCopy 本身不支持 async,但可包裹在 TransactionScope 中

    SqlBulkCopy的WriteToServer方法是一个同步阻塞调用,即便在.NET 6及更高版本中,也没有提供原生的WriteToServerAsync方法。如果希望不阻塞主线程,通常的做法是用Task.Run将其包裹起来在后台线程执行,但要切记,数据库连接对象不能跨线程共享。

    事务控制则是另一个更关键的话题。默认情况下,SqlBulkCopy的每个批次(Batch)都是一个独立的事务。这意味着如果中途失败,只有当前批次的数据会被回滚。如果需要保证整批操作的原子性(要么全部成功,要么全部回滚),就必须显式地传入一个已开启的SqlTransaction对象。

    using var conn = new SqlConnection(connStr);
    conn.Open();
    using var tx = conn.BeginTransaction();
    using var bulk = new SqlBulkCopy(conn) {
        DestinationTableName = "[dbo].[Orders]",
        SqlTransaction = tx  // ⚠️ 这是实现原子操作的关键
    };
    bulk.WriteToServer(dt);
    tx.Commit(); // 全部成功后提交,否则调用 tx.Rollback()

    还有一个容易被忽略的细节:默认情况下,SqlBulkCopy会禁用目标表上的触发器以追求极致速度。如果业务逻辑依赖这些触发器,需要显式设置FireTriggers = true,但这会带来明显的性能损耗。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 C#
    相关文章 更多
    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    谈编程与编程语言
    谈编程与编程语言

    编程的本质是创造性的严谨翻译,通过for、if和函数调用实现重复计算任务。语言发展让集成度提高,门槛降低但竞争加剧。程序员需培养整体架构能力,抓住思想精髓而非追逐新技术,方能长远发展。

    什么是面向接口编程、面向过程编程、面向对象编程?
    什么是面向接口编程、面向过程编程、面向对象编程?

    面向接口编程通过接口解耦,降低耦合度并提升可扩展性和维护性,是面向对象思想的精髓。面向过程编程将问题拆解为步骤,用函数依次执行。面向对象编程将事物抽象为对象,封装属性和方法,通过对象协作解决问题。

    我对编程的一些感悟
    我对编程的一些感悟

    编程这件事,说到底是门手艺活,但又不全是手艺。把代码写出来容易,把代码写好、写出境界,那就得看功夫了。今天聊几个核心判断,算是多年敲键盘的一点沉淀。 一、语言是功夫,思路是内功 编程语言五花八门,就像武林高手会的功夫一样,但想成为顶尖高手,内功必须深厚。内功到了,学新功夫就是分分钟的事。看过《倚天屠

    c#如何使用abstract类_c#abstract类看这一篇就够了_保姆级教程
    c#如何使用abstract类_c#abstract类看这一篇就够了_保姆级教程

    abstract类不能被直接实例化,子类必须用override实现其所有抽象方法。抽象类可实现接口,并以抽象方法转发接口成员。抽象类不能与sealed共用,其抽象方法默认隐式virtual且无方法体。可包含字段、属性等非抽象成员。

    c#如何删除文件_c#删除文件的正确用法与注意事项
    c#如何删除文件_c#删除文件的正确用法与注意事项

    C#删除文件前应先判断存在性以防异常,注意权限不足和文件被占用。File.Delete与FileInfo.Delete功能相同,后者适合多次操作。无异步删除方法,推荐后台执行或限流以避免阻塞。

    c#如何使用EmguCV_c#EmguCV的最佳实践与常见坑点
    c#如何使用EmguCV_c#EmguCV的最佳实践与常见坑点

    在EmguCV中,进行Bitmap转Image时,需先转为24位无Alpha格式,以避免颜色错乱问题;Image转Bitmap时,建议使用Mat或ImageBox控件,以有效减少内存拷贝;跨线程处理时,应使用Mat.Clone()进行深拷贝,以确保数据安全;DLL加载失败时,需设置x64平台目标,并确保native库在输出目录中。

    C#怎么实现图表生成 C#如何用LiveCharts和OxyPlot绘制柱状图折线图饼图【图表】
    C#怎么实现图表生成 C#如何用LiveCharts和OxyPlot绘制柱状图折线图饼图【图表】

    C#图表生成中,LiveCharts需用ChartValues数据集合,并在更新后触发重绘;OxyPlot饼图需启用交互与标签;包引用务必注意版本适配;导出图片需在布局完成后操作,并校正DPI缩放以确保清晰度。

    C#怎么实现过滤器Filter_C# ASP.NET Core过滤器详解教程【进阶】
    C#怎么实现过滤器Filter_C# ASP.NET Core过滤器详解教程【进阶】

    ASP.NETCore过滤器需关注执行顺序、作用域与DI生命周期。接口实现需手动注册,特性继承更常用但需满足构造函数要求。全局注册时注意scoped服务注入问题,Order值须显式设置以控制同类型过滤器执行顺序。异常过滤器仅捕获操作方法内异常,模型绑定与授权失败须分别处理。

    c#如何实现鼠标钩子_c#鼠标钩子完整教程与实战案例
    c#如何实现鼠标钩子_c#鼠标钩子完整教程与实战案例

    实现全局鼠标钩子需使用SetWindowsHookEx配合WH_MOUSE_LL,窗体级事件仅捕获本进程消息。回调函数必须为静态且标记特定签名,禁止阻塞操作。通过Marshal.PtrToStructure解析lParam获取坐标与按键状态。钩子生命周期绑定线程,需注意注册线程持续运行并双重卸载,避免句柄泄漏。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。