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所占用的内存主动释放,然后再去处理下一个数据源。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是C#批量处理数据的方法: 1. 使用SqlBulkCopy类进行批量插入数据到SQL Server数据库中。 ```csharp using System.Data.SqlClient; // 假设有一个DataTable对象dt,包含要插入的数据 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = "dbo.MyTable"; bulkCopy.WriteToServer(dt); } } ``` 2. 使用OracleBulkCopy类进行批量插入数据到Oracle数据库中。 ```csharp using Oracle.ManagedDataAccess.Client; // 假设有一个DataTable对象dt,包含要插入的数据 using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); using (OracleBulkCopy bulkCopy = new OracleBulkCopy(connection)) { bulkCopy.DestinationTableName = "MyTable"; bulkCopy.WriteToServer(dt); } } ``` 3. 使用SQLiteBulkCopy类进行批量插入数据到SQLite数据库中。 ```csharp using System.Data.SQLite; // 假设有一个DataTable对象dt,包含要插入的数据 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteBulkCopy bulkCopy = new SQLiteBulkCopy(connection)) { bulkCopy.DestinationTableName = "MyTable"; bulkCopy.WriteToServer(dt); } } ``` 4. 使用MySqlBulkCopy类进行批量插入数据到MySQL数据库中。 ```csharp using MySql.Data.MySqlClient; // 假设有一个DataTable对象dt,含要插入的数据 using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); using (MySqlBulkCopy bulkCopy = new MySqlBulkCopy(connection)) { bulkCopy.DestinationTableName = "MyTable"; bulkCopy.WriteToServer(dt); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scalzdp

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值