使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据

  1. 使用Datatable作为数据源的方式:

下面的代码使用到了ColumnMappings,因为目标表和数据源Datatable的结构不一致,需要这么一个映射来指定对应关系

  public string SaveJHCData(LzShopBasicData[] datas){var result = new AResult();SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["**"].ConnectionString);con.Open();foreach (var item in datas){Logger.Info("数据更新处理,店铺名称:" + item.ShopName + "数据日期" + item.SellDate);try{using (TransactionScope scope = new TransactionScope()){DataTable JHCOrderItemsdt = SaveJHCOrderItemsData(item);SqlBulkCopy JHCOrderItemscopy = new SqlBulkCopy(con);JHCOrderItemscopy.ColumnMappings.Add("orderId", "orderId");JHCOrderItemscopy.ColumnMappings.Add("auctionId", "auctionId");JHCOrderItemscopy.ColumnMappings.Add("itemTitle", "itemTitle");JHCOrderItemscopy.ColumnMappings.Add("tradeAmt", "tradeAmt");JHCOrderItemscopy.ColumnMappings.Add("alipayNum", "alipayNum");JHCOrderItemscopy.ColumnMappings.Add("tradeTime", "tradeTime");JHCOrderItemscopy.ColumnMappings.Add("uv", "uv");JHCOrderItemscopy.ColumnMappings.Add("srcId", "srcId");JHCOrderItemscopy.ColumnMappings.Add("srcName", "srcName");JHCOrderItemscopy.ColumnMappings.Add("DataType", "DataType");JHCOrderItemscopy.ColumnMappings.Add("DataDate", "DataDate");JHCOrderItemscopy.ColumnMappings.Add("OrderSourceID", "OrderSourceID");JHCOrderItemscopy.ColumnMappings.Add("ShopName", "ShopName");JHCOrderItemscopy.DestinationTableName = "JHCOrderItems";JHCOrderItemscopy.WriteToServer(JHCOrderItemsdt);result.Updatedata += 1;result.UpdatedataText += item.SellDate + ",";scope.Complete();Logger.Info(item.SellDate + "事务提交");}}catch (Exception ex){Logger.Error(ex.ToString());continue;}}con.Close();return result.ToSerializeObject();}

2.使用IDataReader作为数据源的方式,这种方式个人认为用的很少,首先目标表和来源表两个数据库连接你都需要拿到,如果两个都可以拿到,一般直接操作sql就可以解决:

这里是直接拷贝的MSDN的代码,

用到的AdventureWorks 数据库可以直接在网上下载到,

using System.Data.SqlClient;class Program
{static void Main(){string connectionString = GetConnectionString();// Open a sourceConnection to the AdventureWorks database.using (SqlConnection sourceConnection =new SqlConnection(connectionString)){sourceConnection.Open();// Perform an initial count on the destination table.SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM " +"dbo.BulkCopyDemoMatchingColumns;",sourceConnection);long countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar());Console.WriteLine("Starting row count = {0}", countStart);// Get data from the source table as a SqlDataReader.SqlCommand commandSourceData = new SqlCommand("SELECT ProductID, Name, " +"ProductNumber " +"FROM Production.Product;", sourceConnection);SqlDataReader reader =commandSourceData.ExecuteReader();// Open the destination connection. In the real world you would // not use SqlBulkCopy to move data from one table to the other // in the same database. This is for demonstration purposes only.using (SqlConnection destinationConnection =new SqlConnection(connectionString)){destinationConnection.Open();// Set up the bulk copy object. // Note that the column positions in the source// data reader match the column positions in // the destination table so there is no need to// map columns.using (SqlBulkCopy bulkCopy =new SqlBulkCopy(destinationConnection)){bulkCopy.DestinationTableName ="dbo.BulkCopyDemoMatchingColumns";try{// Write from the source to the destination.
                        bulkCopy.WriteToServer(reader);}catch (Exception ex){Console.WriteLine(ex.Message);}finally{// Close the SqlDataReader. The SqlBulkCopy// object is automatically closed at the end// of the using block.
                        reader.Close();}}// Perform a final count on the destination // table to see how many rows were added.long countEnd = System.Convert.ToInt32(commandRowCount.ExecuteScalar());Console.WriteLine("Ending row count = {0}", countEnd);Console.WriteLine("{0} rows were added.", countEnd - countStart);Console.WriteLine("Press Enter to finish.");Console.ReadLine();}}}private static string GetConnectionString()// To avoid storing the sourceConnection string in your code, // you can retrieve it from a configuration file.
    {return "Data Source=(local); " +" Integrated Security=true;" +"Initial Catalog=AdventureWorks;";}
}

View Code

实战:借助类型反射动态构建Datatable数据源,通过SqlBulkCopy批量保存入库

1.获取一张空的Datatable

var dt = bisdal.From<TopBrand>(TopBrand._.ID == -1, OrderByClip.Default).ToDataTable();

2.填充DataTable,这里是通过遍历外部的集合,把属性属性逐一赋值填充到目标Datatable

         foreach (var item in brandselldataitems){try{TopBrand topbrand = new TopBrand{BrandIndex = item.mk,BrandName = item.c58,Date = date,WinnerAmt = item.c60,WinnerPeople = item.c62,WinnerProNum = item.c61,HotTaobaoCategoryID = cid};CreateDtByItem<TopBrand>(topbrand, dt);}catch (Exception ex){Logger.Error(ex.ToString());continue;}}

这里借助反射,遍历实体属性集合,动态构建DataTableRow对象

       private void CreateDtByItem<T>(T item, DataTable dt){System.Reflection.PropertyInfo[] properties = item.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);var newrow = dt.NewRow();foreach (System.Reflection.PropertyInfo pitem in properties){string name = pitem.Name;if (name == "children"){continue;}object value = pitem.GetValue(item, null);newrow[name] = value == null ? DBNull.Value : value;}dt.Rows.Add(newrow);}

3.保存入库,

     BulkWriteToServer(con, "TopBrand", dt);

这里因为目标表和数据源的Datatable数据结构一致,所以省去了ColumnMappings列映射的操作,可以直接WriteToServer保存

     private void BulkWriteToServer(SqlConnection con, string destinationtablename, DataTable sourcedt){try{if (con.State == ConnectionState.Closed){con.Open();}SqlBulkCopy topbranddtcopy = new SqlBulkCopy(con);topbranddtcopy.DestinationTableName = destinationtablename;topbranddtcopy.WriteToServer(sourcedt);con.Close();}catch (Exception ex){Logger.Error("批量新增数据:" + destinationtablename + "," + ex.ToString());}}

完整调用代码:

 private void CreateTopBrandData(int date, int cid, List<BrandSellDataItem> brandselldataitems){try{var dt = bisdal.From<TopBrand>(TopBrand._.ID == -1, OrderByClip.Default).ToDataTable();foreach (var item in brandselldataitems){try{TopBrand topbrand = new TopBrand{BrandIndex = item.mk,BrandName = item.c58,Date = date,WinnerAmt = item.c60,WinnerPeople = item.c62,WinnerProNum = item.c61,HotTaobaoCategoryID = cid};CreateDtByItem<TopBrand>(topbrand, dt);}catch (Exception ex){Logger.Error(ex.ToString());continue;}}BulkWriteToServer(con, "TopBrand", dt);}catch (Exception ex){throw new Exception("CreateTopBrandData:" + ex.ToString());}}

转载于:https://www.cnblogs.com/LittleFeiHu/p/4050391.html

SqlBulkCopy 批量复制数据到数据表相关推荐

  1. SqlBulkCopy批量复制数据

    在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...

  2. .net2.0中SqlBulkCopy批量复制数据出错原因分析!

    在项目后台数据库选择SqlServer,进行批量复制数据时,.net2.0中提供的SqlBulkCopy不失为一个好的选择,性能相当可观;最近亲手实验一把,效果不错,大家可以参见http://www. ...

  3. oracle批量复制,OracleCopier(Oracle数据复制工具)

    OracleCopier是一款简单方便的数据复制工具,帮助用户节省将数据从一个Oracle数据库传输到另一个数据库的时间,用户可以通过软件在Oracle数据库之间来回导数据了,十分方便. 基本简介 O ...

  4. 用.NET SqlBulkCopy类执行批量复制

    在不同数据源之间转移数据是一个常见的开发任务.如果你应用过SQL Server,就会熟悉bcp(批量复制)命令. 它允许你快速将大型文件批量复制到SQL Server表或视图中.在.NET Frame ...

  5. mysql命令行批量添加数据_mysql命令行批量插入100条数据命令

    先介绍一个关键字的使用: delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MYSQL的默认结束符为" ...

  6. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍: 在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个S ...

  7. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  8. mysql批量复制表数据到另外几张表的写法

    delimiter // create procedure oneKey(in newNames varchar(1000),in oldName varchar(250),in id INT,in ...

  9. C# 使用 SqlBulkCopy 类批量复制数据到数据库

    最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...

最新文章

  1. 自己总结的安装zabbix
  2. 数据中台:宜信敏捷数据中台建设实践
  3. 用matplotlib显示一下MNIST数据集中手写数字的真实面目
  4. 《Spark核心技术与高级应用》——1.2节Spark的重要扩展
  5. SQL Server分页查询方法整理
  6. Android studio 单元测试
  7. mysql按字段同步_MySQL同步(一) 基础知识
  8. python mysql 时间比较大小_python时间函数与mysql时间函数转换
  9. SpringBoot系列: 单元测试2
  10. java 删除.svn_使用JAVA的程序删除项目中的SVN目录
  11. 正常人一天步行走路多少为宜
  12. 支持向量机SVM的学习笔记
  13. 2029.石子游戏 IX-LeetCode
  14. dhcpd.conf配置的有关说明
  15. Acer4745G笔记本蓝牙驱动安装
  16. SVN 配置忽略文件
  17. css border流光效果
  18. 3ds max 2020 材质编辑器
  19. 30分钟快速了解云计算
  20. 上海都有哪些牛逼的互联网公司?

热门文章

  1. 【HDU - 1220】Cube (组合数学,简单)
  2. ACM算法--spfa算法--最短路算法
  3. 函授本科统考计算机考试时间,函授2006级计算机、机电本科第一学期考试时间安排.doc...
  4. php开发地图导航,php 实现百度地图(很详细出来的地图)
  5. html5常用插件大全,前端常用插件utils汇总
  6. 修改背景图片_我花了5小时,为网易修改了一份内容超多的PPT,效果超级赞!!...
  7. Java实现:月,日,年,周,访问量统计
  8. hp 导出日志 远程管理卡_惠普服务器远程管理卡安装详解
  9. leetcode414. 第三大的数
  10. Qt学习:QDomDocument