[转]SQLBulkCopy使用
SQLBulkCopy,用于数据库之间大批量的数据传递。通常用于新,旧数据库之间数据的更新。即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来。
首先,SQLBulkCopy需要2个连接。分别连接到不同的旧表所在的数据库,新表所在的数据库。如果是同一个数据库,就可以用同一个SqlConnection对象。
其次,我们要从旧数据库中,把导出的字段读取出来。用什么读呢?可以用Datatable,也可以用SqlDataReader。因为SqlDataReader不占用内存,对大批量的数据复制,不需要事先导入到系统。所以就用SqlDataReader了。
读出后,设定对应关系,设定目标表名,写入。就这么简单。速度非常快!
SqlConnection ConnectionNew = new SqlConnection("连接信息");
SqlConnection ConnectionOld = new SqlConnection("连接信息");
//激发的方法写在外头
private void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
/*
执行的内容。
这里有2个元素值得拿来用
e.RowsCopied,返回数值类型,表示当前已经复制的行数
e.Abort,用于赋值true or false,用于停止赋值的操作
*/
}
public void bulkCopy()
{
try
{
//1.在旧表中,用SqlDataReader读取出信息
SqlCommand cmd = new SqlCommand(SQL, ConnectionOld);
sdr = cmd.ExecuteReader();
//2.初始化SqlBulkCopy对象,用新的连接作为参数。
SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnectionNew);
//3.写对应关系。如旧表的People列的数据,对应新表Human列,那么就写bulkCopy.ColumnMappings.Add("People","Human")
//如果两张表的结构一样,那么对应关系就不用写了。
//我是用哈希表存储对应关系的,哈希表作为参数到传入方法中,key的值用来存储旧表的字段名,VALUE的值用来存储新表的值
foreach (string str in HTDuiYing.Keys)
{
bulkCopy.ColumnMappings.Add(str, HTDuiYing[str].ToString());
}
//4.设置目标表名
bulkCopy.DestinationTableName = TableNmae;
//额外,可不写:设置一次性处理的行数。这个行数处理完后,会激发SqlRowsCopied()方法。默认为1
bulkCopy.NotifyAfter = 10;
//额外,可不写:设置激发的SqlRowsCopied()方法,这里为bulkCopy_SqlRowsCopied
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
//OK,开始传数据!
bulkCopy.WriteToServer(sdr);
}
catch { }
}
也可以直接使用DataTable填充:
private DateTime startTime;
protected void Button1_Click(object sender, EventArgs e)
{
startTime = DateTime.Now;
string srcConnString = "";
string desConnString = "";
SqlConnection srcConnection = new SqlConnection();
SqlConnection desConnection = new SqlConnection();
SqlCommand sqlcmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
//srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;
desConnString = ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();
//srcConnection.ConnectionString = srcConnString;
srcConnection.ConnectionString = desConnString;
sqlcmd.Connection = srcConnection;
//sqlcmd.CommandText = "select * from jobs";
sqlcmd.CommandText = "select * from abc";
sqlcmd.CommandType = CommandType.Text;
sqlcmd.Connection.Open();
da.SelectCommand = sqlcmd;
da.Fill(dt);
SqlBulkCopy sbc = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.UseInternalTransaction);
sbc.BulkCopyTimeout = 5000;
sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
sbc.NotifyAfter = dt.Rows.Count;
try
{
// sbc.DestinationTableName = "jobs";
sbc.DestinationTableName = "bcd";
sbc.WriteToServer(dt);
}
catch (Exception ex)
{
lblCounter.Text = ex.Message.ToString();
}
finally
{
sqlcmd.Clone();
srcConnection.Close();
desConnection.Close();
}
}
private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
{
lblCounter.Text += args.RowsCopied.ToString() + " rows are copied<Br>";
TimeSpan copyTime = DateTime.Now - startTime;
lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";
}
[转]SQLBulkCopy使用的更多相关文章
- 【Update】C# 批量插入数据 SqlBulkCopy
SqlBulkCopy的原理就是通过在客户端把数据都缓存在table中,然后利用SqlBulkCopy一次性把table中的数据插入到数据库中. SqlConnection sqlConn = new ...
- [小干货]SqlBulkCopy简单封装,让批量插入更方便
关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...
- C# 数据批量插入到数据库SqlBulkCopy(源数据类型:List<T> Or DataTable)
/*_____________________ List<T>类型数据 To Sql_______________________________*/ /// <summary& ...
- 用SqlBulkCopy批量安插数据时提示来自数据源的 String 类型的给定值不能转换为指定目标列的类型 int
dr["description"] = ds.Tables[0].Rows[i]["组织描述"].ToString(); dr[& ...
- .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...
- 【转】批量复制操作(SqlBulkCopy)的出错处理:事务提交、回滚
原文地址:http://blog.csdn.net/westsource/article/details/6658109 默认情况下,批量复制操作作为独立的操作执行. 批量复制操作以非事务性方式发生, ...
- 【记录】SqlBulkCopy 跨数据库,表自定义导入
使用场景: 一个数据库中的表数据,导入到另一个数据库中的表中,这两个表的表结构不一样,如果表结构一样的时候,导入非常简单,直接读取导入就行了,表结构不一样,就意味着需要加入一些判断,SqlBulkCo ...
- sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- IBatis 批量插入数据之SqlBulkCopy
public void AddLetters(IList<int> customerIds, string title, string content, LetterEnum.Letter ...
- C# 使用SqlBulkCopy类批量复制大数据
用途说明: 前些日子,公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储.于是在网上进行查找,发现了一个比较好的解决方案,就是采用S ...
随机推荐
- android JNI调用(转)
Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...
- Playmaker Input篇教程之PlayMaker菜单概述
Playmaker Input篇教程之PlayMaker菜单概述 Playmaker InputPlayMaker菜单概述 Playmaker插件被导入游戏项目以后,会自动为Unity编辑器添加一个名 ...
- Android RelativeLayout 实现左右中布局
效果图如下: 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...
- POJ2778 DNA Sequence(AC自动机+矩阵快速幂)
题目给m个病毒串,问不包含病毒串的长度n的DNA片段有几个. 感觉这题好神,看了好久的题解. 所有病毒串构造一个AC自动机,这个AC自动机可以看作一张有向图,图上的每个顶点就是Trie树上的结点,每个 ...
- BZOJ1085 [SCOI2005]骑士精神(IDA*)
IDA*是IDS的基础上加上满足A*算法的估值函数来剪枝的搜索算法. 这题代码量挺少的,可以看出整个IDA*的框架: #include<cstdio> #include<cstrin ...
- TYVJ P1067 合唱队形 Label:上升子序列?
背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号 ...
- Sublime Text 2配置
gedit用了很久,终于换编辑器了T_T Sublime Text 自行百度谷歌. 一开始我在官网下载的压缩包,然后自己配置.搞了半天后果断删掉...还是用源的自动安装吧.T_T 恩.下面的命令 su ...
- oracle系列--第五篇 PLSQL连接本地的Oracle数据库
这篇blog主要是针对新手,我也是个新手:) 我们把oracle成功的安装在了我们的计算机上面,那我们如何才能将PLSQL developer连 接到本地的oracle呢? 首先,我们必须有下面步准备 ...
- ARC指南2 - ARC的开启和禁止
要想将非ARC的代码转换为ARC的代码,大概有2种方式: 1.使用Xcode的自动转换工具 2.手动设置某些文件支持ARC 一.Xcode的自动转换工具 Xcode带了一个自动转换工具,可以将旧的源代 ...
- Java 反射机制学习资料
Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...