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. 信号之system函数

    在http://www.cnblogs.com/nufangrensheng/p/3512291.html中已经有了一个system函数的实现,但是该版本并不执行任何信号处理.POSIX.1要求sys ...

  2. C#数据操作LINQ

    Linq是language integrated query的缩写,即"语言集成查询"之意. Linq主要包含四个组件,Linq to object.Linq to XML.Lin ...

  3. 网络请求OkHttp的使用

     okHttp: 1.okHttp是squere公司出的,在Android4.0以后盛行 2.httpClient 在5.0中弃用,在6.0以Google的sdk中没有该api 3.httpUrlCo ...

  4. LINUX-----管道流及重定向

    1.管道流 在linux中  | 符号代表管道流 用法:command1 | command2 第一个命令的标准输出将作为第二个命令的标准输入 例:cat a.txt | grep "abc ...

  5. Redis主备复制

    Redis 支持 Master-Slave(主从)模式,Redis Server 可以设置为另一个 Redis Server 的主机(从机),从机定期从主机拿数据.特殊的,一个从机同样可以设置为一个 ...

  6. jquery easyui combobox 级联及触发事件,combobox级联

    jquery easyui combobox 级联及触发事件,combobox级联 >>>>>>>>>>>>>>&g ...

  7. set_include_path()的用法

    朋友们 开发的时候 ,总会 遇到 include_once()的情况.有时候,我们需要大量的引用文件,但是被引用文件的路径有时候是个问题.  我们可以把 经常要引用 的文件,放在一个 文件夹中,我们取 ...

  8. cisco通过控制口或者通过远程配置交换机

    学而不思则罔,思而不学则殆,每天坚持一小步,则成功一大步 下面我们通过Cisco Packet来模拟交换机和路由器的远程和控制台登录配置交换机. 交换机console口的连接与配置方法 (1),在Ci ...

  9. 第九篇、UITabbar增加类别用来标红点

    1.系统中只有设置bage的方式,设置为nil也是为一个红点,但是很大,并不是我们需要的 2.扩充标红点的方法 (常用于有新的动态提示标志) #import <UIKit/UIKit.h> ...

  10. iOS 安全:UIWebView访问Https站点防止中间人攻击

    尽管Https协议能够提供数据的加密.身份的认证等安全服务,但并不是没有漏洞.HTTPS协议安全隐患的存在可能使用户受到各种极具破坏力的网络攻击.其中中间人攻击(Man In The Middle, ...