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,一经查实,立即删除!

相关文章

OC-封装、继承、多态

面向对象的三大特征&#xff1a;封装、继承、多态 1.封装 什么是封装&#xff1a;在程序上&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口&#xff0c;控制在程序中属性的读和修改的访问级别&#xff1b;将对象得到的数据和行为&#xff08;或功能&#xff0…

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和都不…

android 安装应用程序apk安装不了

今天用测试机的时候遇到这个问题 解决办法&#xff1a; 在设置里面找到应用程序管理安全设置&#xff0c;&#xff0c;【允许未知来源程序安装】 -------------大致以上思路&#xff0c;具体按钮名称我就不重新去找了------------------

华为鸿蒙消费者,王成录谈鸿蒙挑战和华为消费者业务崛起

据 IDC 数据&#xff0c;全球智能手机出货量已连续 4 年下滑&#xff0c;在移动互联网之后&#xff0c;IoT 被认为是下一个更大量级的机会。在此背景下&#xff0c;鸿蒙是华为力图在 IoT 时代继续领先的关键项目&#xff0c;而面对贸易封锁&#xff0c;鸿蒙也成了华为冲出重围的…

读小米的《参与感》书的摘录(一),与大家分享!

1、互联网思维就是口碑为王 其实在过去选择产品&#xff0c;我们也一直会通过朋友或专家的口碑推荐来做决策&#xff0c;但不是主流。而今天口碑为王的背后&#xff0c;我理解我们面临的信息传播发生了一下三个重要的转变&#xff1a;1、信息从不对称转变为对称&#xff1b;2、…

Fragment的保存

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

html+监听+页面滚动到底部,解决HTML5中滚动到底部的事件问题

问题&#xff1a;在H5中&#xff0c;我们有这样的需求&#xff1a;例如有列表的时候&#xff0c;滚动到底部时&#xff0c;需要加载更多。解决方案&#xff1a;可以采用window的滚动事件进行处理分析&#xff1a;如果滚动是针对整个屏幕而言的(不针对于某个界面小块)&#xff0…

SQL Server 存储引擎-剖析Forwarded Records

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

买面包和IoC

今天上午准备去一个阿姨&#xff0c;在那里买面包。这可能是由于小尺寸她的&#xff0c;因此&#xff0c;管理不规范&#xff0c;所以&#xff0c;当你买面包。没有人行。即使所有的大学生&#xff0c;似几乎没有这种意识。。。 但让我感到震惊的是。尽管没有排队&#xff0c;但…

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

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

html文件怎么生产vm页面,如何使用spring mvc将Html文件转换为.vm(velocity模板)文件...

首先&#xff0c;您需要清楚的是&#xff0c;当您使用MVC时&#xff0c;您可以以任何您想要的方式提供页面。这是您的问题的一个可能的解决方案&#xff0c;这是我自己的应用程序的实际代码。您可能想要像这样提供* .html请求。的web.xmlappServletorg.springframework.web.ser…

统计元音

Problem Description 统计每个元音字母在字符串中出现的次数。 Input 输入数据首先包括一个整数n&#xff0c;表示测试实例的个数&#xff0c;然后是n行长度不超过100的字符串。 Output 对于每个测试实例输出5行&#xff0c;格式如下&#xff1a; a:num1 e:num2 i:num3 o:num4 …

华为谷歌互利合作曝光:或将推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;通常周末接到一个陌生…

教程-Delphi第三方控件安装卸载指南

1 只有一个DCU文件的组件。DCU文件是编译好的单元文件&#xff0c;这样的组件是作者不想把源码公布。一般来说&#xff0c;作者必须说明此组件适合Delphi的哪种版本&#xff0c;如果版本不对&#xff0c;在安装时就会出现错误。也正是因为没有源码&#xff0c;给使用者带来了不…

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

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

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

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