SQLBulkCopy,用于数据库之间大批量的数据传递。通常用于新,旧数据库之间数据的更新。即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来。

1.初始化SqlBulkCopy对象,用新的连接作为参数。
SqlBulkCopy bulkCopy = new SqlBulkCopy(链接字符串);

2.数据源与目的数据表的映射关系(列名要对应)

bulkCopy.ColumnMappings.Add("source",'"dest")

3.设置目标表名
 bulkCopy.DestinationTableName = 目标表名;

4.设置一次性处理的行数。这个行数处理完后,会激发SqlRowsCopied()方法。默认为1
bulkCopy.NotifyAfter = 10;

5.传输数据

bulkCopy.WriteToServer(sdr);

目前有一个txt文档,里面记录了大量的数据

然后我们用常见的数据库操作将其导入数据库中

 OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "txt文件|*.txt";
if (ofd.ShowDialog() == false)
{ return;
}
//读取txt中的内容,然后拼接字符串
//readlines可以一行一行读取内容,并保留内容中的换行符,而 ReadAllLines 时,必须等待整个字符串数组返回后才能访问该数组。 因此,在处理非常大的文件时,ReadLines 可能更高效。
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ToString()))
{
con.Open();
//当前时间
DateTime startTime = DateTime.Now;
for(int i=;i<=lines.Length;i++)
{
string line=lines[i];
string[] strs = line.Split('\t'); string startNum = strs[]; string city = strs[];
city = city.Trim('"'); string type = strs[];
type = type.Trim('"'); string areaNum = strs[];
areaNum = areaNum.Trim('"');
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = @"insert into T_TelNum(StartNum,TelArea,TelType,AreaNum)
values(@StartNum,@TelArea,@TelArea,@AreaNum)";
cmd.Parameters.Add(new SqlParameter("@StartNum",startNum));
cmd.Parameters.Add(new SqlParameter("@TelArea", city));
cmd.Parameters.Add(new SqlParameter("@TelType", type));
cmd.Parameters.Add(new SqlParameter("@AreaNum", areaNum));
cmd.ExecuteNonQuery();
}
//执行到第i条的时间
DateTime nowTime = DateTime.Now;
TimeSpan ts = nowTime - startTime;
//double totalTime=(ts.TotalSeconds/(i+1))*(lines.Length)/60; //需要总秒数
double totalTime = ts.TotalSeconds * lines.Length / (i + );

运行项目,查看需要完成的总秒数。

一共将要运行时间1671秒,将近28分钟。

然后我们用SqlBulkCopy来读取数据并存储。

  //创建一个DatatTable用于传递参数。
DataTable table = new DataTable();
//创建列与数据库对应上
table.Columns.Add("StartNum");
table.Columns.Add("TelArea");
table.Columns.Add("TelType");
table.Columns.Add("AreaNum");
DateTime start = DateTime.Now;
for (int i = ; i <= lines.Length; i++)
{
string line = lines[i];
string[] strs = line.Split('\t'); string startNum = strs[]; string city = strs[];
city = city.Trim('"'); string type = strs[];
type = type.Trim('"'); string areaNum = strs[];
areaNum = areaNum.Trim('"');
DataRow row = table.NewRow();
row[] = startNum;
row[] = city;
row[] = type;
row[] = areaNum; } using (System.Data.SqlClient.SqlBulkCopy copy = new System.Data.SqlClient.SqlBulkCopy(ConfigurationManager.ConnectionStrings[].ToString()))
{
//目的地的数据表名
copy.DestinationTableName = "T_TelNum";
//数据源与目的数据表的映射关系
copy.ColumnMappings.Add("StartNum", "StartNum");
copy.ColumnMappings.Add("TelArea", "TelArea");
copy.ColumnMappings.Add("TelType", "TelType");
copy.ColumnMappings.Add("AreaNum", "AreaNum"); copy.WriteToServer(table);
}
double totoleTime = DateTime.Now.Second- start.Second;

不难发现只用了3秒钟,所以可以看出在对大数据处理时最好使用SqlBulkCopy来进行操作!

SqlBulkCoy和普通数据库操作执行速度对比的更多相关文章

  1. Laravel—数据库操作与Eloquent模型使用总结

    数据库操作 执行原生SQL //查询 $emp = DB::select('select * from employees where emp_no = 1'); $emp = DB::select( ...

  2. 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷

    原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEcl ...

  3. SQL 2005 中查询或执行另外的数据库操作的方法

    原文:SQL 2005 中查询或执行另外的数据库操作的方法 摘要: 如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据, ...

  4. mysql在cmd命令下执行数据库操作

    windows+r 运行cmd命令,执行以下操作! 当mysql 数据库文件相对于来说比较大的时候,这个时候你可能在正常环境下的mysql中是导入不进去的,因为mysql数据库本身就有默认的导入文件大 ...

  5. Docker for Windows(五)实践搭建SqlServer服务&执行数据库操作

    上一篇我们已经搭建了一个mysql数据库服务了:Docker for Windows(四)实践搭建&删除MySQL服务,发现用Docker确实是方便且容易,但上一篇主要是服务的搭建删除等基础操 ...

  6. Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  7. ORACLE数据库误操作执行了DELETE,该如何恢复数据?

    ORACLE数据库误操作执行了DELETE,该如何恢复数据? 原创 2016年08月11日 17:23:04 10517 作为一个程序员,数据库操作是必须的,但是如果操作失误,一般都会造成比较严重的后 ...

  8. 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷

    通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下:     步骤1:通过MyEclipse中的window->show View->ot ...

  9. mysql数据库批量执行sql文件对数据库进行操作【windows版本】

    起因: 因工作需要,在本机测试环境升级mysql数据库,需逐条执行mysql数据库的sql文件对数据库进行升级,因此找了些关于mysql的文章,对批量升级数据库所需的sql文件进行升级. 整理思路: ...

随机推荐

  1. 文件I/O(不带缓冲)之open函数

    调用open函数可以打开或创建一个文件. #include <fcntl.h> int open( const char *pathname, int oflag, ... /* mode ...

  2. 为ListView添加头和脚

      转自:https://software.intel.com/zh-cn/blogs/2014/12/15/android-listview-addheaderview-addfooterview ...

  3. axel源码学习(1)——重要流程细节

    前面一篇文章的流程太过于简单,基本没有触及到axel的核心,因此本文将要把axel中的几个重要的主要的操作流程单独弄出来看看,还是按照main函数的执行顺序来展开,略去错误处理之类的流程仅仅着眼于最重 ...

  4. 深入理解计算机系统第二版习题解答CSAPP 2.15

    只使用位级运算和逻辑运算,编写一个C表达式,它等价于x==y.换句话说,当x和y相等时它将返回1,否则就返回0. !(x ^ y)

  5. mysql 数据备份还原

    悲剧的一天,不小心将数据库删了... 命令行备份数据库 1.mysqldump命令进行备份.该命令将连接MySQL服务器并创建SQL转储文件,该文件包含了重新创建数据库所必需的所有SQL语句.该命令的 ...

  6. linux版本的区分

    linux每个版本有好几种方式,刚学习的时候还不明白,了解了一下终于知道了 如下,以CentOS为例 1.CentOS系统镜像有两个,安装系统只用到第一个镜像即CentOS-6.x-i386-bin- ...

  7. Javascript日期处理类库Moment.js

    1.组件详情地址Moment.js中文网 http://momentjs.cn/ 2.几个方法: (1) 日期格式化 moment().format(); // 2016-02-29T14:03:30 ...

  8. Xilinx 网站资源导

    Xilinx 网站资源导读 ———版权声明———–本文作者 Ricky Suwww.fpganotes.comrickysu.fpga@gmail.com 欢迎转载,转载请保持原样及署名商业使用须得到 ...

  9. [Laravel]配置路由小记

    Laravel:4.2 使用的后台是:laravel-backend php artisan routes 使用这个代码,可以看到显示目前项目的路由器 ,我需要添加功能,我就需要添加路由 /* |-- ...

  10. JSDOM之节点

    javascript-节点属性详解 根据 DOM,HTML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 HTML 标签是一个元素节点 包含在 HTML 元素中 ...