SqlBulkCopy 批量复制数据到数据表

使用 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Ac 控件,Android控件--MultiAutoCompleteTextView

1.功能可支持选择多个值(在多次输入的情况下)&#xff0c;分别用分隔符分开&#xff0c;并且在每个选中的时候再次输入值时会自动匹配&#xff0c;可用在发短信、发邮件时选择联系人这种类型当中。2.独特属性android:completionThreshold"3" ----设置输入多少字符时自…

BZOJ1299 [LLH邀请赛]巧克力棒

怎么又是博弈论。。。我去 Orz hzwer&#xff0c;这道题其实是可以转化成Nim游戏的&#xff01; "第一步&#xff1a; 先从n根巧克力棒中取出m(m>0)根&#xff0c;使得这m根巧克力棒的xor和为0&#xff0c;同时使得剩下的n-m根巧克力棒无论怎么取&#xff0c;xor和都不…

Fragment的保存

2019独角兽企业重金招聘Python工程师标准>>> 一、场景 在一个fragment播放语音文件&#xff0c;一旦设备发生旋转&#xff0c;播放将暂停。因为fragment将重新生成。具体的流程步骤如下&#xff1a; 二、解决的方式 在Fragment的onCreate方法中&#xff0c;设置s…

SQL Server 存储引擎-剖析Forwarded Records

我们都知道数据在存储引擎中是以页的形式组织的,但数据页在不同的组织形式中其中对应的数据行存储是不尽相同的,这里通过实例为大家介绍下堆表的中特有的一种情形Forwared Records及处理方式. 概念 堆表中,当对其中的记录进行更新时,如果当前数据页无法满足更新行的容量,此时这…

u3d游戏开发视频潭州_游戏美术行业的发展与应用人工智能学院专业介绍及未来前景系列报告会二...

为了让2020级新同学对动漫专业加深认识&#xff0c;更好的规划学习&#xff0c;学院于11月12日6点晚邀请了校企合作单位“369云遮月游戏公司”在长安校区图书馆阶梯教室进行了游戏美术行业的发展与应用的报告会&#xff0c;主题围绕“专业介绍与发展前景”展开&#xff0c;云遮…

华为谷歌互利合作曝光:或将推Nexus手表

业内传言称&#xff0c;中国的华为科技公司和韩国LG电子公司&#xff0c;今年将为谷歌公司设计两款Nexus品牌的智能手机&#xff0c;这也将是华为科技第一次参加谷歌的Nexus硬件计划。日前&#xff0c;国外权威媒体披露了华为Nexus硬件计划的更多内容。除了一款5.7英寸的智能手…

unity2d随机生成物体_2020 年最好用的一键生成设计神器,全在这里了!

对于很多新手设计师来说&#xff0c;要高效率地完成一件看上去还不错的设计作品&#xff0c;其实并不是一件容易的事。特别是在现实的工作中&#xff0c;对于临危受命的任务&#xff0c;更是很少有人会耐心地等你慢慢去摸索的.……不慌&#xff0c;今天就掏出一份私藏已久的设计…

android MPV架构快速实现,不是所有的MPV都叫GL8,一体化智能座舱体验来袭

进入车内&#xff0c;首先映入眼帘的就是双12.3吋全液晶仪表及中控联屏&#xff0c;出色的画面质感在第一时间吸引了我的注意。当然&#xff0c;全新的一体化智能座舱理念&#xff0c;多屏互联、多维交互也是它的最大亮点之一。全新一代别克GL8家族采用迭代更新的通讯解决方案&…

基于SuperSocket的IIS主动推送消息给android客户端

在上一篇文章《基于mina框架的GPS设备与服务器之间的交互》中&#xff0c;提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介&#xff0c;经常出现无法通信的问题&#xff0c;必须一天几次的手动回收程序池&#xff0c;甚至重起服务器&#xff0c;通常周末接到一个陌生…

明细表如何添加重量_关于Revit中明细表标准的导出及导入

Revit中明细表的作用非常大&#xff0c;项目中的数据归类整理及统计都离不开它&#xff0c;今天给大家分享一下如何在Revit中进行明细表标准的导出及导入&#xff0c;减少在实际项目中的重复性工作。1. 首先在Revit中新建一个项目文件&#xff0c;在平面视图中随便画几条管道&a…

鸿蒙还是不是安卓,华为捐赠鸿蒙核心架构!是否形成“三足鼎立”?

发布会已经开完&#xff0c;万物互联时代也已开启。经过测试&#xff0c;鸿蒙系统支持几乎所有的安卓软件&#xff0c;换句话说安卓用户可以无缝过渡到鸿蒙系统&#xff0c;相比安卓&#xff0c;速度更快&#xff0c;耗电量更低&#xff0c;这无疑比安卓系统的体验好出一个档次…

Filter基金会

一个、总结 简单的说&#xff0c;Filter的作用就是拦截(Tomcat的)service&#xff08;Request&#xff0c;Response&#xff09;方法。拿到Request、Response对象进行处理。然后释放控制。继续自己主动流转。其运用的还是“分层”的思想。至于为什么要增加这一层&#xff0c;为…

python2处理耗时任务_RabbitMQ Go客户端教程2——任务队列/工作队列

本文翻译自RabbitMQ官网的Go语言客户端系列教程&#xff0c;本文首发于我的个人博客&#xff1a;liwenzhou.com&#xff0c;教程共分为六篇&#xff0c;本文是第二篇——任务队列。这些教程涵盖了使用RabbitMQ创建消息传递应用程序的基础知识。 你需要安装RabbitMQ服务器才能完…

使用 CSS3 伪元素实现立体的照片堆叠效

CSS3 里引入的伪元素让 Web 开发人员能够在不需要额外添加 HTML 标签的情况下制作出复杂的视觉效果。例如&#xff0c;:before 和 :after 这个两个 CSS3 伪元素就可以帮助你实现很多有趣的效果。本教程将告诉你如何使用 CSS3 为元素创建一组漂亮的图片堆叠效果。 效果演示 …

启发式搜索A*算法

A* 寻路算法 (2011-02-15 10:53:11) 转载▼标签&#xff1a; 游戏 分类&#xff1a; 算法概述 虽然掌握了 A* 算法的人认为它容易&#xff0c;但是对于初学者来说&#xff0c; A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点移动到 B 点&#xff0c…

centos7全盘备份到本地_CentOS7下制作openssl1.1.1i RPM包并升级

点击上方"walkingcloud"关注&#xff0c;并选择"星标"公众号CentOS7下制作openssl1.1.1i RPM包并升级OpenSSL最新漏洞 OpenSSL官方发布了拒绝服务漏洞风险通告&#xff0c;漏洞编号为CVE-2020-1971漏洞详情OpenSSL是一个开放源代码的软件库包&#xff0c;应…

计算机网络基础专业找工作,2021计算机网络技术前景怎么样? 好找工作吗

很多同学想知道计算机网络技术前景怎么样&#xff0c;以下是一些相关信息的整理&#xff0c;希望能对同学们有所帮助&#xff01;计算机网络技术前景从目前的情况看&#xff0c;企业的IT技术管理岗位一般设置为企业信息主管、总监等&#xff1b;工程技术岗位设置为网络工程师、…

安装 VMware Tools

第一步&#xff1a;挂载VMware Tools 第二步&#xff1a; 将上图VMware Tools-9.2.0 XXXX.tar.gz 复制到tmp目录&#xff08;其他目录也行&#xff0c;没有权限操作需要 chmod 777 XXX 修改来获取权限&#xff09; 第三步&#xff1a;解压 tar xvzf VMwareTools-9.2.0-799703.t…

LINUX添加一块网卡地址配置及问题

如何如何网卡服务重启慢关掉service NetworkManager stopchkconfig NetworkManager off 关于NetworkManager外链&#xff1a;http://www.linuxidc.com/Linux/2013-08/88809.htm 查看cat /etc/udev/rules.d/70-persistent-net.rules是否网卡名有重复VMware虚拟机安装好CentOS6.…

[每日一题jQuery] jQuery选择器总结:进一步过滤、同级操作、后代操作

jQuery选择器继承自CSS的风格&#xff0c;可以通过jQuery选择器找出特定的DOM元素&#xff0c;在此基础上对该元素做相应处理。jQuery不仅支持简单的标签选择器、类选择器、id选择器&#xff0c;还针对表单状态、子元素、元素顺序提供相应的选择器。如果熟练运用&#xff0c;则…