C#批量数据处理SqlBulkCopy

1.什么是SqlbulkCopy,解决的问题

在程序处理中经常会遇见大数据量的批量操作,比如我们要把一个文本格式的数据批量插入数据库。如果按照传统的逻辑只会将从文件中读出的数据以轮询的方式一条一条的插入到目标数据库里面,这样反复连接打开数据库执行插入命令效率极其低下。所以很多程序在处理这样的插入操作的时候都是在半夜用户低风期处理,以免影响正常用户的使用。

.Net Framework提供的SqlbulkCopy函数就可以将原来一条一条处理的数据进行批量处理,不需要在一条一条的长时间处于一件插入的操作了。

2.SqlbulkCopy使用方法

SqlbulkCopy,首先我们需要获取到源数据源,然后连接到目标数据库建立SqlbulkCopy对应视图,最后执行插入命令。瞬间就能插入百万条数据到SqlServer数据库里面去。

2.1获取数据源数据
获取数据源数据这个可能是一个长时间的过程,因为我们的数据源来自多种类型比如,数据库、扁平文件、接口数据等等各种各样。具体的获取数据根据具体数据源需要制定解决方案。

2.2 连接到目标数据库
这里的SqlbulkCopy,我只用来向SqlServer数据库里面批量写入数据。能否向Oracle数据库写入数据还需要具体的研究。

2.3 建立SqlbulkCopy对应视图和插入数据
 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(trans.Connection, SqlBulkCopyOptions.KeepIdentity, trans))
            {
                bulkCopy.BatchSize = 100000;
                bulkCopy.BulkCopyTimeout = 1800;

               //将DataTable表名作为待导入库中的目标表名 
               bulkCopy.DestinationTableName = destinationTable;

                //将数据集合和目标服务器库表中的字段对应  
                for (int i = 0; i < sourceTable.Columns.Count; i++)
                {
                   //列映射定义数据源中的列和目标表中的列之间的关系
                   //bulkCopy
                   bulkCopy.ColumnMappings.Add(sourceTable.Columns[i].ColumnName, sourceTable.Columns[i].ColumnName);
                }
                //SqlBulkCopyMapping(bulkCopy);
                try
                {
                    bulkCopy.WriteToServer(sourceTable);
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    trans.Rollback();
               }
            }

以上的代码指定了每一次插入数据库的数据量的大小为100000条,每一次插入数据的最大时间为1800毫秒,并且指定了插入的目标表名称。

由于在插入过程中可能会有失败,我们为了保证插入数据的完整性,在插入过程中带上数据库事务。只有在完全插入之后提交事务,插入操作成功。

由于我们把数据源组织成为DataTable的所以我们可以通过

bulkCopy.ColumnMappings.Add(sourceTable.Columns[i].ColumnName, sourceTable.Columns[i].ColumnName);来建立DataTable和数据库里面字段之间的对应关系——通过字段名称进行对应的。最后一步通过bulkCopy.WriteToServer(sourceTable);就可以把数据源数据sourceTable插入到数据库里面了。


3.SqlbulkCopy需要注意的性能问题

在使用SqlbulkCopy中需要注意的问题,要把某个数据源批量插入数据库,首先需要把这个数据源完全加载到内存之中,然后进行插入操作,这样就会占用大量的内存,如果在进行下一次插入操作的时候没有释放内存中的数据那么整个机器的运行效率会被严重的拖慢,所以建议把源数据加载成为DataTable格式然后进行插入操作之后将这个DataTable所占用的内存主动释放,然后再去处理下一个数据源。

C#批量数据处理SqlBulkCopy,布布扣,bubuko.com

时间: 2024-10-13 12:25:53

C#批量数据处理SqlBulkCopy的相关文章

C# winform DataTable 批量数据处理 增、删、改 .

1.批量新增,采用高效的SqlBulkCopy SqlBulkCopy DTS = new System.Data.SqlClient.SqlBulkCopy(con); DTS.NotifyAfter = 1; DTS.DestinationTableName = datatable.name; DTS.BulkCopyTimeout = 60000000; DTS.WriteToServer(datatable); succ = dtSource.Rows.Count.ToString();

sqlserver数据库批量插入-SqlBulkCopy

当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时.我使用了两种方式: 每次插入数据时,都只插入一条数据库,这个会导致每次插入数据时不断打开关闭数据库链接,导致效率过低(最差) 使用拼接字符串的方式来进行批量插入数据,但是使用StringBuilder 会占用极大的内存 以上方式对于批量插入数据都不是一个好的选择, 针对这种情况我使用了SqlBulkCopy sqlbulkCopy:将其它数据源批量加载sqlserv

批量插入 SqlBulkCopy的测试

关于SqlBulkCopy的测试 最近要做.net关于sql大量插入,找到了sqlbulkcopy(自己google下,应该很多说明了)这个好东西,于是测试下性能,用了三个方法对比: 1)直接用ado.net,for循环N次进行单条插入 2)把N条插入语句拼在一个sql,进行插入 3)直接使用sqlbulkcopy进行插入 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

关于销帮帮签订时间与开始时间错误的批量处理工具

开发背景 在使用销帮帮的时候错误的将签订时间和开始时间弄错了,造成开始时间是正确的签订时间,签订时间是正确的开始时间.在2020年前需要把错误数据处理掉. 解决方案 方案一:可以通过导入导出功能,把数据导出来,然后更新字段后重新导入进去. 缺点:由于有同名的人员,销帮帮的导入不能正确处理同名的人员信息,所以该方案否决. 方案二:通过销帮帮API更新数据,通过咨询销帮帮的相关技术负责人,确定更新时,不需要拿到所有的数据,更新那个字段就修改那个字段即可,类似于SQL: Update Table Se

翻译-In-Stream Big Data Processing 流式大数据处理

相当长一段时间以来,大数据社区已经普遍认识到了批量数据处理的不足.很多应用都对实时查询和流式处理产生了迫切需求.最近几年,在这个理念的推动下,催生出了一系列解决方案,Twitter Storm,Yahoo S4,Cloudera Impala,Apache Spark和Apache Tez纷纷加入大数据和NoSQL阵营.本文尝试探讨流式处理系统用到的技术,分析它们与大规模批量处理和OLTP/OLAP数据库的关系,并探索一个统一的查询引擎如何才能同时支持流式.批量和OLAP处理. 在Grid Dy

Spark Streaming:大规模流式数据处理的新贵(转)

原文链接:Spark Streaming:大规模流式数据处理的新贵 摘要:Spark Streaming是大规模流式数据处理的新贵,将流式计算分解成一系列短小的批处理作业.本文阐释了Spark Streaming的架构及编程模型,并结合实践对其核心技术进行了深入的剖析,给出了具体的应用场景及优化方案. 提到Spark Streaming,我们不得不说一下BDAS(Berkeley Data Analytics Stack),这个伯克利大学提出的关于数据分析的软件栈.从它的视角来看,目前的大数据处

spring batch批量处理框架

spring batch精选,一文吃透spring batch批量处理框架 前言碎语 批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.SpringBatch基于POJO和Spring框架,相当容易上手使用,让开发者很容易地访问和利用企业级服务.spring batch具有高可扩展性的框架,简单的批处理,复杂的大数据批处理作业都可以通过SpringBatch框架来实现. spring batch

RedisCluster如何实现Pipeline批量模式?

上一篇文章<redis pipeline批量处理提高性能>中我们讲到redis pipeline模式在批量数据处理上带来了很大的性能提升,我们先来回顾一下pipeline的原理,redis client与server之间采用的是请求应答的模式,如下所示: Client: command1 Server: response1 Client: command2 Server: response2 - 在这种情况下,如果要完成10个命令,则需要20次交互才能完成.因此,即使redis处理能力很强,仍

大数据生态之数据处理框架探索

数据处理框架 数据处理是一个非常宽泛的概念,数据处理框架在数据架构中,主要是用于数据移动和分析这两大功能当中.对于数据移动,有离线数据移动和实时数据移动,也可以叫做是批量数据移动和流式数据移动.而对于分析这一块,有离线数据分析和实时数据分析,也可以称作是批量数据分析和流式数据分析.离线和实时,批量和流式,针对这两种不同的形式,就出现了多种不同的数据处理框架.有批量的数据处理框架,有流式的数据处理框架,也有批流融合的框架. 批量数据处理框架 批量数据处理框架最经典的就是 mapreduce 了,这