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. Fast portable non-blocking network programming with Libevent--转

    Learning Libevent Chapter 0: About this document Chapter 1: A tiny introduction to asynchronous IO. ...

  2. c/c++指针基础使用

    #include <iostream> #include <string> using namespace std; int main() { "; "; ...

  3. swift switch语句

    switch选择 1)case多条件匹配:条件之间用逗号隔开 用三个点表示范围:…,..<:表示不包含上边界 var tand = 1 switch tand{    case 0:       ...

  4. JAVA_FastJson

    package com.qf.mobiletrain01; import java.util.List; import com.alibaba.fastjson.JSON; class Student ...

  5. iptables配置说明

    1.iptables的发展:  对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测.iptables是网络层的防火墙.   iptables的前身叫 ...

  6. hdf5 api

    https://www.physics.ohio-state.edu/~wilkins/computing/HDF/hdf5tutorial/index.html

  7. js Date.UTC() 与 php strtotime()生成的时间截不一样

    Difference in UTC date between PHP and Javascript 工作中,因使用highcharts显示数据,需要将PHP 将日期转换为UTC 时区的时间截,然后通过 ...

  8. 【转】周末班LR笔记总结—新手入门必备

    本来想上传文件的,上传半天没反应,只有这样了,图片不知道能显示不. 上午 学到2012.1.13 七天课 第一天(入门)二.三.四天(VUGEN脚本) 五天(Controller)六天(Analyse ...

  9. 通过Workbook类 生成Excel导出数据

    需求: 实现错误信息生成Excel保存到本地让用户查看. 刚开始使用了微软自带的Microsoft.Office.Interop.Excel类库. Microsoft.Office.Interop.E ...

  10. php上传文件大小限制

    和你的配置文件有关.改一下PHP配置文件php.ini给你总结下相关配置,自己去改吧 1.php.ini:upload_max_filesize 所上传的文件的最大大小.默认值2M. 2.php.in ...