sqlbulkcopy 多表批量保存
/// <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);
- class Program
- {
- static volatile bool result;
- static void Main(string[] args)
- {
- DataSet ds = ExportDataSet();
- //使用2个线程模拟并发操作
- Thread t = new Thread(delegate() { result = Insert(ds); Console.WriteLine(result ? "导入成功" : "导入失败"); });
- t.Start();
- Thread t1 = new Thread(delegate() { result = Insert(ds); Console.WriteLine(result ? "导入成功" : "导入失败"); });
- t1.Start();
- Console.ReadLine();
- }
- /// <summary>
- /// 获取数据DataSet
- /// </summary>
- /// <returns></returns>
- static private DataSet ExportDataSet()
- {
- //局域网的某服务器模拟数据库远程连接
- SqlConnection RemoteConn = new SqlConnection("Data Source=192.168.0.183;Initial Catalog=Northwind;User ID=sa;Password=sa");
- using (
- /* 目标表与源表结构并不相同,目标表只包含OrderID、CustomerID、EmployeeID、ShipCountry这四个字段。注意这里字段 是区分大小写的,不然SqlBulkCopy的WriteToServer方法会报运行时异常:“给定的 ColumnMapping 与源或目标中的任 意列均不匹配”的处理方法。这个地方浪费了我1个小时才发现*/
- SqlDataAdapter oda = new SqlDataAdapter("SELECT [OrderID], [CustomerID], [EmployeeID], [ShipCountry] FROM [Northwind].[dbo].[Orders]", RemoteConn))
- //如果目标表与源表结构完全一致,则用下面语句即可,msdn的例子也只是这样
- //SqlDataAdapter oda = new SqlDataAdapter("SELECT * FROM [Ednoland].[dbo].[Score]", RemoteConn))
- {
- DataSet ds = new DataSet();
- oda.Fill(ds, "Orders");//给定表名
- return ds;
- }
- }
- /// <summary>
- /// 将DataSet导入远程数据库(未来放在WebService中)
- /// </summary>
- /// <param name="ds"></param>
- /// <returns></returns>
- public static bool Insert(DataSet ds)
- {
- using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;User ID=sa;Password=sa"))
- {
- sqlconn.Open();
- SqlTransaction sqlbulkTransaction = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
- using (SqlBulkCopy sbc = new SqlBulkCopy(sqlconn, SqlBulkCopyOptions.KeepIdentity, sqlbulkTransaction))
- {
- sbc.BatchSize = 20000;//20000行每连接
- sbc.BulkCopyTimeout = 50;//50秒超时
- if (ds.Tables == null || ds.Tables.Count == 0)
- return false;
- if (ds.Tables.Count == 1)
- {
- return BulkInsert(sbc, ds.Tables[0], sqlbulkTransaction); ;
- }
- else
- {
- bool res = true;
- foreach (DataTable dt in ds.Tables)
- {
- res = BulkInsert(sbc, dt, sqlbulkTransaction);
- }
- return res;
- }
- }
- }
- }
- private static bool BulkInsert(SqlBulkCopy sbc, DataTable dt, SqlTransaction sqlbulkTransaction)
- {
- bool res = true;
- try
- {
- //将DataTable表名作为待导入库中的目标表名
- sbc.DestinationTableName = dt.TableName;
- //将数据集合和目标服务器库表中的字段对应
- for (int i = 0; i < dt.Columns.Count; i++)
- {
- //sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
- sbc.ColumnMappings.Add(i,i);//可以避免字段大小写不一致造成无法映射的问题
- }
- sbc.WriteToServer(dt);
- //提交事务
- sqlbulkTransaction.Commit();
- res = true;
- }
- catch (SqlException ex)
- {
- res = false;
- sqlbulkTransaction.Rollback();
- }
- return res;
- }
- }
sqlbulkcopy 多表批量保存的更多相关文章
- 使用EntityManager批量保存数据
@PersistenceContext EntityManager em; 从别的系统中定期同步某张表的数据,由于数据量较大,采用批量保存 JPA EntityManager的四个主要方法 ① pub ...
- mybatis单笔批量保存
在上一篇写了接口调用解析返回的xml,并赋值到实体.这一篇主要介绍,如何保存实体数据. 一,xml样例 <?xml version="1.0" encoding=" ...
- 使用SpringBoot-JPA进行自定义的保存及批量保存
更多精彩博文,欢迎访问我的个人博客 说明 SpringBoot版本:2.1.4.RELEASE java版本:1.8 文中所说JPA皆指spring-boot-starter-data-jpa 使用J ...
- mybatis父子表批量插入
<!--父子表批量插入 --> <insert id="insertBatch" parameterType="com.niwopay.dto.beni ...
- .NET DLL 保护措施应用实例(百度云批量保存工具)
最近做了个小工具,将保护措施思路全部应用到了此工具中. 点我下载 百度云批量保存工具是一款专门用于自动批量保存百度云分享的软件. 本软件特点:1:完全模拟人工操作:2:可以批量保存百度分享的文件( ...
- C#实现在注册表中保存信息
C#实现在注册表中保存信息 最近做的项目需要在注册表中记录一些用户设置,方便在程序下次启动时读取设置,应用上次用户保存的设置,挺简单的. 写出来,方便记忆,以后要用,可以直接改改就能用. 1 usin ...
- Howto: 在ArcGIS10中将地图文档(mxd文档)批量保存到之前版本
Howto: 在ArcGIS10中将地图文档(mxd文档)批量保存到之前版本 文章编号 : 38783 软件: ArcGIS - ArcEditor 10 ArcGIS - ArcInfo 10 A ...
- Jquery Easy UI Datagrid 上下移动批量保存数据
DataGrid with 上下移动批量保存数据 通过前端变量保存修改数据集合,一次性提交后台执行 本想结合easyui 自带的$('#dg').datagrid('getChanges'); 方法来 ...
- mybatis批量保存的两种方式(高效插入)
知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...
随机推荐
- Python3 序列解包
转载自:https://blog.csdn.net/yilovexing/article/details/80576788 序列解包是 Python 3.0 之后才有的语法 什么是序列解包呢?先看一个 ...
- oracle中date数据的转换问题
(TO_NUMBER(TO_CHAR(FP.KPRQ, 'HH24')) >= 18 kprq >= to_DATE ('2017-01-12 18:00:00','yyyy-MM-dd ...
- Codeforces 1105C Ayoub and Lost Array (计数DP)
<题目链接> 题目大意: 有一个长度为 n 的数列的未知数列,数列的每一个数的值都在区间 [l,r] 的范围内.现在问你能够构成多少个这样的数组,使得数组内的所有数的和能够被 3 整除. ...
- config-toolkit之config-face
config-toolkit是当当网开发的开源项目,使用起来非常的方便.对于很多配置都可以写在配置中心中,进行配置数据的获取,这样我们可以不用把很多信息写在了代码里面,例如数据库账号密码等信息. co ...
- Xamarin Essentials教程构建共享请求
Xamarin Essentials教程构建共享请求 共享请求类ShareTextRequest可以用于构建复杂形式的数据,用于向其他应用传输.例如,它可以指定共享内容的主题Subject,用于给邮件 ...
- Ubantu17.10 上安装gitlab
http://www.jianshu.com/p/92f97939e33a 亲测成功
- 2017-9-14-Linux移植:加快Linux主机的启动速度
参考文章:http://www.mintos.org/skill/fast-boot.html 今天本来不打算写Blog了,Linux笔记本开机太慢了,浪费生命.何不干脆写一篇关于加快Linux主机启 ...
- 利用api模拟百度搜索功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Charles——前端必备模拟后端数据
Charles--前端必备模拟后端数据 现在都是前后端分离开发了,前端开发者经常会遇到一个问题如何模拟后端数据来进行开发调试,在这里给大家介绍一个前端神器--Charles. 安装 安装就不赘述了,直 ...
- BZOJ2808 : 那些年我们画格子
若$\min(n,m)=1$,那么设$f[i][j][k]$表示考虑前$i$个格子,改变了$j$次颜色,$i$的颜色为$k$的方案数,直接转移即可. 否则$\min(n,m)\geq 2$,那么有解当 ...