使用C#进行MySql百万级数据迁移

C# 使用MySqlBulkLoader 批量导入数据到Mysql 前言:    最近做了一个导入数据的功能,需求大概是这样的,有张Excel表格,将里面的数据插入到mysql已经建好的表里面,而且字段要一一对应,之前我们用的是SqlServer数据库,实现这个批量插入的工作就很简单了,我们可以用SqlBulkCopy批量更新数据,但是在Mysql的ADO操作对象中并没有这个对象,难道要去拼接Insert语句么?小编找到了这样一个有用的对象—— MySq 阅读详情

奇怪的需求又来了。

MySql数据迁移可以使用Navicat自带的工具进行很方便的迁移,但是需要筛选数据,想到了用ETL工具进行数据迁移,但是组长说用C#代码进行数据迁移……

SqlServer有自带的SqlBulkCopy方法进行批量插入,我找到了MySql的MySqlBulkLoader。
废话不多说,上代码。

		static void Main(string[] args)
        {
            DataTable dt = new DataTable();
           	dt.TableName = "source";
           	dt.Columns.AddRange(new DataColumn[] {
                new DataColumn("Id",typeof(int)),
                new DataColumn("Name",typeof(string)),
                new DataColumn("Age",typeof(int)),
                new DataColumn("Address",typeof(string)),
                new DataColumn("DataStatus",typeof(int))
           	});
            for (int i = 0; i < 1000000; ++i)
            {
                DataRow dr = dt.NewRow();
                dr["Id"] = i;
                dr["Name"] = "张三." + i;
                dr["Age"] = 18;
                dr["Address"] = "广东省小溪路" + i + "号";
                dr["DataStatus"] = 0;
                dt.Rows.Add(dr);
            }
            string con = "database=sqlbulk;uid=root;pwd=root;server=localhost;";
            var result = BulkInsert(con, dt);

            Console.WriteLine("完成了:" + result + "条。共:" + dt1.Rows.Count);
            Console.ReadKey();
        }
        ///将DataTable转换为标准的CSV  
        /// </summary>  
        /// <param name="table">数据表</param>  
        /// <returns>返回标准的CSV</returns>  
        private static string DataTableToCsv(DataTable table)
        {
            //以半角逗号(即,)作分隔符,列为空也要表达其存在。  
            //列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。  
            //列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。  
            StringBuilder sb = new StringBuilder();
            DataColumn colum;
            foreach (DataRow row in table.Rows)
            {
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    colum = table.Columns[i];
                    if (i != 0) sb.Append(",");
                    if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
                    {
                        sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
                    }
                    else sb.Append(row[colum].ToString());
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }
        public static int BulkInsert(string connectionString, DataTable table)
        {
            if (string.IsNullOrEmpty(table.TableName)) throw new Exception("请给DataTable的TableName属性附上表名称");
            if (table.Rows.Count == 0) return 0;
            int insertCount = 0;
            string tmpPath = Path.Combine(Directory.GetCurrentDirectory(), "Temp.csv"); //Path.GetTempFileName();
            string csv = DataTableToCsv(table);
            File.WriteAllText(tmpPath, csv);
            using (MySqlConnection conn = new MySqlConnection(connectionString))
            {
                try
                {
                    Stopwatch stopwatch = new Stopwatch();
                    stopwatch.Start();
                    conn.Open();
                    MySqlBulkLoader bulk = new MySqlBulkLoader(conn)
                    {
                        FieldTerminator = ",",
                        FieldQuotationCharacter = '"',
                        EscapeCharacter = '"',
                        LineTerminator = "\r\n",
                        FileName = tmpPath,
                        NumberOfLinesToSkip = 0,
                        TableName = table.TableName,

                    };
                    insertCount = bulk.Load();
                    stopwatch.Stop();
                    Console.WriteLine("耗时:{0}", stopwatch.ElapsedMilliseconds);
                }
                catch (MySqlException ex)
                {
                    throw ex;
                }
            }
            File.Delete(tmpPath);
            return insertCount;
        }

是的,该方法是将DataTable转换为CSV文件,之后通过MySqlBulkLoader的load方法批量写入数据库,100w五列大概需要七秒钟左右,写入DataTable也比较吃内存,占用了四百兆左右。

……然后发现这个方法好像他喵的不可以筛选数据,遇到重复的数据就报错了。
于是乎改用另一种方式…

			string path = "C:/MySql/data/temp.txt";
            mark:
            if (File.Exists(path))
            {
                Console.WriteLine($"目录文件已存在,回Y删除");
                string temp = Console.ReadLine();
                if (temp == "y" || temp == "Y")
                {
                    File.Delete(path);
                    goto mark;
                }
            }
            else
            {
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                MySqlConnection conn = new MySqlConnection(con);
                //复制源表A
                MySqlCommand cmd = new MySqlCommand($"select * INTO OUTFILE '{path}' FROM SourceA", conn);
                conn.Open();
                int flag = cmd.ExecuteNonQuery();
                conn.Close();
                stopwatch.Stop();
                Console.WriteLine($"导出txt花费了{stopwatch.ElapsedMilliseconds}毫秒");
                Console.WriteLine("--------------------------------------");
                if (flag > 0)
                {
                    Console.WriteLine($"导出了{flag}条数据到{path}文件下");
                    stopwatch.Start();
                    MySqlConnection conn1 = new MySqlConnection(con1);
                    //REPLACE  遇重更新  IGNORE 遇重跳过        判断以主键唯一依赖
                    //复制至目标表B  注意表结构需要完全相同
                    cmd = new MySqlCommand($"LOAD DATA INFILE '{path}' IGNORE INTO TABLE SourceB", conn1);
                    
                    conn1.Open();
                    flag = cmd.ExecuteNonQuery();
                    conn1.Close();

                    stopwatch.Stop();

                    Console.WriteLine($"复制txt花费了{stopwatch.ElapsedMilliseconds}毫秒");
                    if (flag > 0)
                    {
                        Console.WriteLine($"copy数据{flag}条至新的表中");
                    }
                    else
                    {
                        Console.WriteLine($"0条新数据无需copy");
                    }
                    Console.WriteLine("-----------------END---------------------");
                }
            }
            Console.ReadKey();

大同小异,只不过这个方法只是用C#执行了两条MySql的语句,一切交给数据库引擎来操作,执行速度大概在9秒钟左右,虽然功能实现了,但是……感觉好弱智,不过需求如此。。

C#读取txt文件并存入数据库:ETL场景下的高效实现与性能优化 ETL(Extract-Transform-Load)是数据处理的核心环节,涉及从非结构化文本中提取数据、清洗转换后持久化到结构化存储。在C#中,利用StreamReader流式读取可高效处理大文件,避免内存溢出;通过ADO.NET或SqlBulkCopy实现批量插入,能大幅提升写入性能。该技术方案在制造业设备日志导入、金融对账单处理等场景中价值显著,可有效打通数据孤岛。本文围绕C#读取txt文件并存入数据库的完整链路,深入解析编码检测、分隔符解析、批量提交等关键细节,并提供可落地的代码实现与优化清单。 阅读详情

相关推荐

SqlSugar实战:如何用BulkCopy在3秒内插入百万条数据(附性能对比)

本文深入解析了SqlSugar ORM框架中的BulkCopy功能,通过实战演示如何在3秒内高效插入百万条数据。文章对比了传统插入方式的性能瓶颈,详细介绍了BulkCopy的核心原理、代码实现、关键参数调优以及实战中关于自增主键、索引、内存管理等常见问题的避坑指南,为处理海量数据插入场景提供了高性能解决方案。

weixin_29306011的博客 238

c#关于Mysql MySqlBulkLoader 批量上传

MySqlBulkLoader是MySQL提供的一种高效的数据批量上传机制,它可以在数据库中上传大量的数据,而不必逐条插入,从而提高数据插入的效率。MySqlBulkLoader在C#语言的实现中,是在MySql.Data.MySqlClient命名空间下的一个类,可以直接调用该类的方法来上传大量数据。下面我们将详细介绍使用MySqlBulkLoader实现批量上传的操作步骤,以便开发人员更好的了解该功能。

naer_chongya的博客 1445

SqlSugar批量操作全攻略:从插入到更新、删除的完整指南(含性能对比)

本文深入解析SqlSugar ORM框架的批量操作功能,提供从插入、更新、删除到合并的完整实战指南。通过对比BulkCopy、BulkInsert、BulkUpdate、BulkMerge和BulkDelete等核心方法的原理与适用场景,并结合详尽的性能测试数据,帮助C#开发者针对不同数据量级与业务需求,选择最优的批量操作策略,实现数据库交互效率的显著提升。

p5l2m9n4o6q的博客 427

MySqlBulkLoader一种高效的数据保存方案

最近在处理大批量数据入库的问题,认识了MySqlBulkLoader,这是一种可以高效地实现MySql数据保存入库的方案,分享给各位爱技术懂技术的小伙伴。

寒冰屋的专栏 755

.NET 8 分库分表实战:AI 辅助构建高性能订单系统架构

数据库水平扩展是应对海量数据增长的核心技术方案,其核心原理是通过将数据分散到多个物理节点,以突破单机在I/O、连接数和锁竞争上的性能瓶颈。这项技术能显著提升系统的读写吞吐量和存储容量,是实现高并发、高可用架构的关键。在电商、社交、物联网等数据密集型应用场景中,分库分表是支撑业务持续增长的基石。本文将聚焦于 .NET 技术栈,结合 Entity Framework Core,深入探讨如何设计分片键与路由策略,并解决跨分片查询这一经典难题。同时,文章将展示如何利用 AI 工具辅助进行架构决策和代码生成,提升工程

weixin_33835103的博客 310

多线程+多连接池:CSV大文件导入数据库的性能优化实战

在数据库交互场景中,数据导入是常见需求。当CSV文件达到百万行级别时,传统单连接逐条插入方式性能急剧下降。理解连接池与线程池的工作原理是优化基础:连接池复用数据库连接,线程池控制并发度,而多连接池则为导入任务隔离专属资源。通过批量提交、多线程并行、有界队列背压等机制,可显著提升写入吞吐量,将导入耗时从分钟级甚至小时级压缩至秒级。该方案适用于数据迁移、ETL、日志分析等大数据量导入场景。本文深入解析多线程+多连接池并行导入CSV的设计思路、核心代码与调优策略,帮助开发者应对大文件导入的性能挑战。

weixin_33924312的博客 312

C# 并行和多线程3(同步机制上)

同步机制 Barrier(屏障同步) 比如我们数据库中有100w条数据需要导入excel,为了在数据库中加速load,我们需要开多个任务去跑,比如这里的4个task,要想load产品表,必须等4个task都跑完用户表才行,那么你有什么办法可以让task为了你两肋插刀呢?它就是Barrier。 如果我们的屏障设为4个task就认为已经满了的话,那么执行中先到的task必须等待后到的task,通知方式也就是barrier.SignalAndWait(),屏障中线程设置操作为new Barrier(4,(i

gmadc的博客 308

数据库国产化探究及升级改造过程指导

当前官网最新版本为DM8,相较于目前主流产品架构:不同特性依靠不同内核去实现,DM8独特采用了双存储引擎架构,行存储引擎和列存储引擎可相互配合、协同工作。同时实现了计算层和存储层的分离,同一内核既支持共享存储式集群,也支持分布式事务集群。

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 5380

通过EF连接MySql数据库,并启动自动数据迁移

1、先安装MySql数据库,最好安装最新版本,因为在通过EF连接MySql数据库的过程中,有些无法解决的问题,在MySql数据库升级到最新版本后就不存在了。 2、在C#项目中的 NuGet包管理器中安装 EntityFramework(6.1.3版本)、MySql.Data(6.9.12版本)、MySql.Data.Entity(6.9.12版本) 3、添加程序集 System.Data.Ent...

a2247889821的博客 852

C#如何在海量数据下的高效读取写入MySQL

主要介绍了C#如何在海量数据下的高效读取写入MySQL的相关资料,需要的朋友可以参考下

SAP资产按每天折旧功能介绍

注意:此处在计算百分比时将30天作为剩余使用寿命,因为SAPS/4HANA中的计算是通过考虑购置第一年的折旧总天数来进行的。这是因为我在计算总使用寿命时只使用了365天,如果剩余使用寿命大于1年,SAPS/4HANA会将闰年规范化为365天。此功能仅对确定使用寿命或剩余寿命百分比的折旧键有用,如果需要,这种折旧到日的解决方案可以应用于需要每天计算折旧的跨行业(任何国家/行业)。注意:这里在计算百分比时考虑了2天,因为364天已经过期,但目前我们到达2024年,使用寿命为366天。它只会在下一年生效。

yanzibing99的博客 1562

C#实战:用MySqlBulkCopy实现MySQL百万级数据秒级导入(附完整代码)

本文详细介绍了如何使用C#中的MySqlBulkCopy工具实现MySQL百万级数据的秒级导入,包括环境配置、核心用法、性能优化及异常处理等实战技巧。通过完整的代码示例和性能对比,展示了MySqlBulkCopy在批量新增数据场景下的高效优势,帮助开发者大幅提升数据处理效率。

weixin_29197699的博客 191

云计算学习——5G网络技术

华为eNSP网络设备模拟器的基础安装及简单使用

qq_42520799的博客 1445

海量数据转储备忘及C#的SqlBulkCopy类使用说明

今天遇到百万级数据转储,跟一众猿兄猿弟讨论了下,大概有下面几种解决方式: 1.从源导出为文件再导入目标(似乎会有问题,但这是小米加步枪时代的唯一解决办法) 2.使用ORACLE数据泵技术(这个好像从ORACLE到SQL不行) 3.使用C#的SqlBulkCopy控件(可行!付强同学分析,这玩意使用BCP协议,估计也集成了数据泵技术) 4.存储支持的物理快照(这个速度可以到秒级,但是非常贵。

佣兵的收纳盒 3497

第186篇 前馈控制——提升跟踪精度的补充手段

文章摘要: 本文介绍了前馈控制的原理及其在工程中的应用。与反馈控制不同,前馈控制通过提前预测目标值或扰动信息来生成控制量,避免误差出现后再纠正的延迟问题,适用于机器人、机械臂等高速运动场景。前馈控制通常与PID反馈配合使用,前者提供粗调,后者进行微调。文章详细讲解了前馈增益的调节方法(模型法、实验法、自适应法)及两种前馈类型(指令前馈和扰动前馈),并提供了代码示例和面试实战建议,强调前馈与反馈的协同设计是提升控制精度的关键。最后预告了下一篇将讨论串级PID控制架构。

郑伟强dev的专栏 400

计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

提出此算法的背景是基于图片的缩放,在图片缩放的过程中,实质上就是将原图像像素矩阵像素值,填到目标图像像素矩阵中,目标图像像素矩阵可能比原图像像素矩阵大(图片放大),也可能小(图片缩小)。我们假设图片的宽(WidthWidthWidth)和高(HeightHeightHeight)是按同比例缩放的,那么 srcXsrcWidth=dstXdstWidth\frac{srcX}{srcWidth}= \frac{dstX}{dstWidth}srcWidthsrcX​=dstWidthdstX​ ...

FRIGIDWINTER的博客 7286

Access数据库到Mysql数据库实时更新

项目目标: 首先是将Access数据库中的大量数据(已经存好的原有百万级数据)转存到mysql数据库中,然后,随着Access中数据的增加,要同步更新mysql数据库,更新周期自定。 思路:一开始的转存前篇博客已经讲过,这里就忽略了,主要是实现Access数据更新后同步到mysql中。思路是: 1.用MAX的sql语句查找mysql数据表,找出时间那一列的最大时间MAX(patrol_tim

qq_40903561的博客 5927

传感器校准与标定:传感器的灵敏度校准_(11).常见传感器的灵敏度校准方法

线性校准:适用于传感器输出与输入之间存在线性关系的情况。通过收集数据并使用最小二乘法拟合线性方程,可以确定斜率和截距,从而实现校准。非线性校准:适用于传感器输出与输入之间存在非线性关系的情况。通过收集数据并使用非线性拟合方法(如最小二乘法),可以确定多项式或其他非线性方程的参数,从而实现校准。温度补偿校准:适用于传感器在不同温度下输出特性变化的情况。通过收集不同温度下的数据并使用温度补偿方程,可以提高传感器在不同温度下的测量精度。其他校准方法。

2401_87715305的博客 918

c#oracle数组超出,急问:System.IndexOutOfRangeException: 索引超出了数组界限解决方案

当前位置:我的异常网» C#»急问:System.IndexOutOfRangeException: 索引超出了急问:System.IndexOutOfRangeException: 索引超出了数组界限解决方案www.myexceptions.net网友分享于:2013-01-25浏览:498次急问:System.IndexOutOfRangeException: 索引超出了数组界限最...

weixin_39705018的博客 4306

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

相比于国外FPGA厂商EDA开发环境,几个G到几十个G的大小,高云云源软件安装包也很小巧,界面也很简洁,综合速度非常快,是我没想到的,好像在使用单片机一样,点一下就编译完成了,以本文简单的LED示例工程为例,比特流文件几乎在几秒钟内生成;无论是下载比特流文件到RAM还是Flash中,速度都很快,而且只有一种fs程序文件格式,不用再进行bit/mcs转换;云源软件自带的编辑器也很好用,和Notepad++界面差不多,而且快捷键很方便,具有基本的自动补全功能。

whik1194的博客 5461

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 185

从混乱到有序:Dapper多数据库同步的一致性解决方案

你是否还在为多数据库间的数据同步焦头烂额?不同数据库语法差异、事务一致性难以保证、大批量数据迁移性能低下——这些问题不仅耗费大量开发时间,还可能导致数据不一致风险。本文将展示如何使用Dapper([Dapper/](https://link.gitcode.com/i/da641d24419bf82c1e59d0cd16cd89c7))这一轻量级ORM工具,通过其灵活的API和扩展组件,轻松实现跨...

gitblog_00284的博客 322

道路缺陷检测实战指南:基于YOLOv11的深度学习系统从搭建到落地

道路缺陷检测项目的每一步,都是“理论→实践→反思→优化”的成长循环。当你看到自己开发的系统能精准识别出道路上的每一处裂缝、每一个坑洼时,那种“技术解决真实问题”的成就感,会让你明白深度学习不止是论文里的公式,更是改变行业的工具。如果过程中遇到模型不收敛、界面功能异常等问题,不妨把问题拆解成“数据是否标注准确?”“模型参数是否合理?”“界面逻辑是否有漏洞?”等小问题逐一排查。记住,每解决一个问题,你就离“能独立落地AI项目的工程师”更近一步。

LXY_LOVE36的博客 172

Unity MMORPG服务器架构:基于Mirror的区域管理与兴趣网格实战

在多人网络游戏开发中,服务器架构设计是支撑大规模玩家同时在线的核心技术基础。其核心原理在于通过高效的状态同步与数据分发机制,确保所有玩家在虚拟世界中的体验一致且流畅。这一技术的核心价值在于能够承载高并发、实现无缝大世界,并保证游戏的公平性与稳定性。典型的应用场景包括大型多人在线角色扮演游戏(MMORPG)、开放世界生存游戏等需要海量玩家实时互动的产品。本文聚焦于利用Unity引擎和Mirror网络库,通过区域管理将游戏世界划分为可独立运行的逻辑单元,并结合兴趣网格算法优化数据同步范围,从而构建一个可扩展的服

weixin_30256901的博客 486

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

HelloGitHub 第 69 期开源项目精选:40 个有趣、入门级项目的全景导读

> HelloGitHub 是每月 28 号发布的开源项目推荐月刊,专注于分享 GitHub 上有趣、入门级的开源项目。本文以第 69 期([content/HelloGitHub69.md](https://link.gitcode.com/i/795a06fc618327f33c8b98ae72401b8b),英文版见 [content/en/HelloGitHub69.md](https:/

gitblog_00430的博客 447

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

企业级标签打印系统解决方案:设计与实现

标签打印系统是企业信息化建设中的重要组成部分,通过将产品信息、物流数据等关键内容可视化输出,实现供应链全流程的可视化管理。其核心技术包括模板渲染算法、批量数据处理和打印队列优化等,能够显著提升企业的运营效率和准确性。在制造业、物流仓储等行业中,这类系统通常与ERP、MES等业务系统深度集成,支持从条码生成到打印任务管理的全流程自动化。以敖维标签打印软件为例,其采用C/S混合架构设计,结合C# WPF客户端与Java服务端的技术优势,特别开发的C++打印引擎比传统方案快3倍以上,实测帮助电子元器件厂商将标签错

weixin_34233974的博客 289

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: easyui datagrid自定义操作列按钮组使用menubutton
Async.7
博客等级 码龄9年 4粉丝 2原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值