/// <summary>
/// 批量保存多表
/// </summary>
/// <param name="dt1"></param>
/// <param name="TableName"></param>
/// <returns></returns>
public static void SqlBatchCopy(DataTable dt, string TableName,DataTable dt1, string TableName1)
{
using (SqlTransaction st = Con.BeginTransaction())
{
using (SqlBulkCopy copy = new SqlBulkCopy(Con, SqlBulkCopyOptions.Default, st))
{
for (int i = 0; i < dt.Columns.Count; i++)
{
copy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
copy.DestinationTableName = TableName;
copy.WriteToServer(dt);
}
using (SqlBulkCopy copy = new SqlBulkCopy(Con, SqlBulkCopyOptions.Default, st))
{
for (int i = 0; i < dt1.Columns.Count; i++)
{
copy.ColumnMappings.Add(dt1.Columns[i].ColumnName, dt1.Columns[i].ColumnName);
}
copy.DestinationTableName = TableName1;
copy.WriteToServer(dt1);
}
st.Commit();
}
}

//简单测试

DataTable tb = new DataTable();
tb.Columns.Add( "Cname1", typeof (string));
DataRow dr = tb.NewRow();
for (int i = 1; i <= 10000; i++)
{
dr = tb.NewRow();
dr[ "Cname1"] = "测试" + i;
tb.Rows.Add(dr);
}

System.Diagnostics. Stopwatch st = new System.Diagnostics.Stopwatch();
st.Start();
using (System.Data.SqlClient.SqlBulkCopy copy = new System.Data.SqlClient.SqlBulkCopy ("server=.;database=TestA;uid=sa;pwd=sasa"))
{
copy.ColumnMappings.Add( "Cname1", "Cname" );
copy.DestinationTableName = "TbA";
copy.WriteToServer(tb);
}
st.Stop();
MessageBox.Show( "新增成功,耗时" + st.ElapsedMilliseconds);

  1. class Program
  2. {
  3. static volatile bool result;
  4. static void Main(string[] args)
  5. {
  6. DataSet ds = ExportDataSet();
  7. //使用2个线程模拟并发操作
  8. Thread t = new Thread(delegate() { result = Insert(ds); Console.WriteLine(result ? "导入成功" : "导入失败"); });
  9. t.Start();
  10. Thread t1 = new Thread(delegate() { result = Insert(ds); Console.WriteLine(result ? "导入成功" : "导入失败"); });
  11. t1.Start();
  12. Console.ReadLine();
  13. }
  14. /// <summary>
  15. /// 获取数据DataSet
  16. /// </summary>
  17. /// <returns></returns>
  18. static private DataSet ExportDataSet()
  19. {
  20. //局域网的某服务器模拟数据库远程连接
  21. SqlConnection RemoteConn = new SqlConnection("Data Source=192.168.0.183;Initial Catalog=Northwind;User ID=sa;Password=sa");
  22. using (
  23. /* 目标表与源表结构并不相同,目标表只包含OrderID、CustomerID、EmployeeID、ShipCountry这四个字段。注意这里字段 是区分大小写的,不然SqlBulkCopy的WriteToServer方法会报运行时异常:“给定的 ColumnMapping 与源或目标中的任 意列均不匹配”的处理方法。这个地方浪费了我1个小时才发现*/
  24. SqlDataAdapter oda = new SqlDataAdapter("SELECT [OrderID], [CustomerID], [EmployeeID], [ShipCountry] FROM [Northwind].[dbo].[Orders]", RemoteConn))
  25. //如果目标表与源表结构完全一致,则用下面语句即可,msdn的例子也只是这样
  26. //SqlDataAdapter oda = new SqlDataAdapter("SELECT * FROM [Ednoland].[dbo].[Score]", RemoteConn))
  27. {
  28. DataSet ds = new DataSet();
  29. oda.Fill(ds, "Orders");//给定表名
  30. return ds;
  31. }
  32. }
  33. /// <summary>
  34. /// 将DataSet导入远程数据库(未来放在WebService中)
  35. /// </summary>
  36. /// <param name="ds"></param>
  37. /// <returns></returns>
  38. public static bool Insert(DataSet ds)
  39. {
  40. using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;User ID=sa;Password=sa"))
  41. {
  42. sqlconn.Open();
  43. SqlTransaction sqlbulkTransaction = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
  44. using (SqlBulkCopy sbc = new SqlBulkCopy(sqlconn, SqlBulkCopyOptions.KeepIdentity, sqlbulkTransaction))
  45. {
  46. sbc.BatchSize = 20000;//20000行每连接
  47. sbc.BulkCopyTimeout = 50;//50秒超时
  48. if (ds.Tables == null || ds.Tables.Count == 0)
  49. return false;
  50. if (ds.Tables.Count == 1)
  51. {
  52. return BulkInsert(sbc, ds.Tables[0], sqlbulkTransaction); ;
  53. }
  54. else
  55. {
  56. bool res = true;
  57. foreach (DataTable dt in ds.Tables)
  58. {
  59. res = BulkInsert(sbc, dt, sqlbulkTransaction);
  60. }
  61. return res;
  62. }
  63. }
  64. }
  65. }
  66. private static bool BulkInsert(SqlBulkCopy sbc, DataTable dt, SqlTransaction sqlbulkTransaction)
  67. {
  68. bool res = true;
  69. try
  70. {
  71. //将DataTable表名作为待导入库中的目标表名
  72. sbc.DestinationTableName = dt.TableName;
  73. //将数据集合和目标服务器库表中的字段对应
  74. for (int i = 0; i < dt.Columns.Count; i++)
  75. {
  76. //sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
  77. sbc.ColumnMappings.Add(i,i);//可以避免字段大小写不一致造成无法映射的问题
  78. }
  79. sbc.WriteToServer(dt);
  80. //提交事务
  81. sqlbulkTransaction.Commit();
  82. res = true;
  83. }
  84. catch (SqlException ex)
  85. {
  86. res = false;
  87. sqlbulkTransaction.Rollback();
  88. }
  89. return res;
  90. }
  91. }

sqlbulkcopy 多表批量保存的更多相关文章

  1. 使用EntityManager批量保存数据

    @PersistenceContext EntityManager em; 从别的系统中定期同步某张表的数据,由于数据量较大,采用批量保存 JPA EntityManager的四个主要方法 ① pub ...

  2. mybatis单笔批量保存

    在上一篇写了接口调用解析返回的xml,并赋值到实体.这一篇主要介绍,如何保存实体数据. 一,xml样例 <?xml version="1.0" encoding=" ...

  3. 使用SpringBoot-JPA进行自定义的保存及批量保存

    更多精彩博文,欢迎访问我的个人博客 说明 SpringBoot版本:2.1.4.RELEASE java版本:1.8 文中所说JPA皆指spring-boot-starter-data-jpa 使用J ...

  4. mybatis父子表批量插入

    <!--父子表批量插入 --> <insert id="insertBatch" parameterType="com.niwopay.dto.beni ...

  5. .NET DLL 保护措施应用实例(百度云批量保存工具)

    最近做了个小工具,将保护措施思路全部应用到了此工具中. 点我下载   百度云批量保存工具是一款专门用于自动批量保存百度云分享的软件. 本软件特点:1:完全模拟人工操作:2:可以批量保存百度分享的文件( ...

  6. C#实现在注册表中保存信息

    C#实现在注册表中保存信息 最近做的项目需要在注册表中记录一些用户设置,方便在程序下次启动时读取设置,应用上次用户保存的设置,挺简单的. 写出来,方便记忆,以后要用,可以直接改改就能用. 1 usin ...

  7. Howto: 在ArcGIS10中将地图文档(mxd文档)批量保存到之前版本

     Howto: 在ArcGIS10中将地图文档(mxd文档)批量保存到之前版本 文章编号 : 38783 软件: ArcGIS - ArcEditor 10 ArcGIS - ArcInfo 10 A ...

  8. Jquery Easy UI Datagrid 上下移动批量保存数据

    DataGrid with 上下移动批量保存数据 通过前端变量保存修改数据集合,一次性提交后台执行 本想结合easyui 自带的$('#dg').datagrid('getChanges'); 方法来 ...

  9. mybatis批量保存的两种方式(高效插入)

    知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...

随机推荐

  1. mysql group by组内排序

    mysql group by组内排序:     首先是组外排序:     SELECT z.create_time,z.invoice_id from qf_invoice_log z where z ...

  2. 大数据及Hadoop的概述

    一.大数据存储和计算的各种框架即工具 1.存储:HDFS:分布式文件系统   Hbase:分布式数据库系统   Kafka:分布式消息缓存系统 2.计算:Mapreduce:离线计算框架   stor ...

  3. 002.Zabbix简介

    一 Zabbix简介 1.1 概述 Zabbix是一个企业级的高度集成开源监控软件,提供分布式监控解决方案.可以用来监控设备.服务等可用性和性能. 1.2 所支持监控方式 目前由zabbix提供包括但 ...

  4. C#多线程编程实战(二)

    1.1 简介 为了防止一个应用程序控制CPU而导致其他应用程序和操作系统本身永远被挂起这一可能情况,操作系统不得不使用某种方式将物理计算分割为一些虚拟的进程,并给予每个执行程序一定量的计算能力.此外操 ...

  5. skatebroads

    skateboardsn.滑板( skateboard的名词复数 ) == skateboard英 [ˈskeɪtbɔ:d]  . 斯给特博得. 美 [ˈskeɪtbɔ:rd] n.滑板复数: ska ...

  6. Yahoo Programming Contest 2019.D.Ears(DP)

    题目链接 菜爆了啊QAQ 记起点为\(S\),终点为\(T\),走过的最靠左的点是\(L\),最靠右的点是\(R\). 那么坐标轴被分成了五段: \(0\sim L-1\):经过\(0\)次: \(L ...

  7. Sql的行列(纵横表)转换

    1.行转列: 表结构和数据: DROP TABLE IF EXISTS `kj`; CREATE TABLE `kj` ( `姓名` ) DEFAULT NULL, `课程` ) DEFAULT NU ...

  8. golang单例模式

    1.定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问. 2.分类: 懒汉方式:指全局的单例实例在第一次被使用时构建. 饿汉方式:指全局的单例实例在类装载时构建. 3.实现: (1)懒汉方 ...

  9. [BZOJ5064]B-number

    [BZOJ5064]B-number 题目大意: 求\(1\sim n(n\le10^{15})\)间有多少数满足是\(13\)的倍数且包含字符串\(13\). 思路: 数位DP.\(f[i][j][ ...

  10. [AHOI2017/HNOI2017]大佬

    Description: 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事 ...