SqlBulkCoy和普通数据库操作执行速度对比_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > SqlBulkCoy和普通数据库操作执行速度对比

SqlBulkCoy和普通数据库操作执行速度对比

 2013/8/31 3:09:24  magicyu  博客园  我要评论(0)
  • 摘要:SQLBulkCopy,用于数据库之间大批量的数据传递。通常用于新,旧数据库之间数据的更新。即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来。1.初始化SqlBulkCopy对象,用新的连接作为参数。SqlBulkCopybulkCopy=newSqlBulkCopy(链接字符串);2.数据源与目的数据表的映射关系(列名要对应)bulkCopy.ColumnMappings.Add("source",'"dest")3.设置目标表名bulkCopy
  • 标签:数据库 数据 执行 速度 SQL 操作

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文档,里面记录了大量的数据

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

 1 OpenFileDialog ofd = new OpenFileDialog();
 2             ofd.Filter = "txt文件|*.txt";
 3             if (ofd.ShowDialog() == false)
 4             {
 5 
 6                 return;
 7             }
 8             //读取txt中的内容,然后拼接字符串
 9             //readlines可以一行一行读取内容,并保留内容中的换行符,而 ReadAllLines 时,必须等待整个字符串数组返回后才能访问该数组。 因此,在处理非常大的文件时,ReadLines 可能更高效。 
10             string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
11             using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ToString()))
12             {
13                 con.Open();
14                 //当前时间
15                 DateTime startTime = DateTime.Now;
16                 for(int i=1;i<=lines.Length;i++)
17                 {
18                     string line=lines[i];
19                     string[] strs = line.Split('\t');
20 
21                     string startNum = strs[0];
22 
23                     string city = strs[1];
24                     city = city.Trim('"');
25 
26                     string type = strs[2];
27                     type = type.Trim('"');
28 
29                     string areaNum = strs[3];
30                     areaNum = areaNum.Trim('"');
31                     using (SqlCommand cmd = con.CreateCommand())
32                     {
33                         cmd.CommandText = @"insert into T_TelNum(StartNum,TelArea,TelType,AreaNum) 
34                                  values(@StartNum,@TelArea,@TelArea,@AreaNum)";
35                         cmd.Parameters.Add(new SqlParameter("@StartNum",startNum));
36                         cmd.Parameters.Add(new SqlParameter("@TelArea", city));
37                         cmd.Parameters.Add(new SqlParameter("@TelType", type));
38                         cmd.Parameters.Add(new SqlParameter("@AreaNum", areaNum));
39                         cmd.ExecuteNonQuery();
40                     }
41                     //执行到第i条的时间
42                     DateTime nowTime = DateTime.Now;
43                     TimeSpan ts = nowTime - startTime;
44                     //double totalTime=(ts.TotalSeconds/(i+1))*(lines.Length)/60;
45 
46                     //需要总秒数
47                     double totalTime = ts.TotalSeconds * lines.Length / (i + 1);

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

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

 

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

 1  //创建一个DatatTable用于传递参数。
 2             DataTable table = new DataTable();
 3             //创建列与数据库对应上
 4             table.Columns.Add("StartNum");
 5             table.Columns.Add("TelArea");
 6             table.Columns.Add("TelType");
 7             table.Columns.Add("AreaNum");
 8             DateTime start = DateTime.Now;
 9             for (int i = 1; i <= lines.Length; i++)
10             {
11                 string line = lines[i];
12                 string[] strs = line.Split('\t');
13 
14                 string startNum = strs[0];
15 
16                 string city = strs[1];
17                 city = city.Trim('"');
18 
19                 string type = strs[2];
20                 type = type.Trim('"');
21 
22                 string areaNum = strs[3];
23                 areaNum = areaNum.Trim('"');
24                 DataRow row = table.NewRow();
25                 row[0] = startNum;
26                 row[1] = city;
27                 row[2] = type;
28                 row[3] = areaNum;
29                 
30             }
31 
32 
33             using (System.Data.SqlClient.SqlBulkCopy copy = new System.Data.SqlClient.SqlBulkCopy(ConfigurationManager.ConnectionStrings[0].ToString()))
34             {
35                 //目的地的数据表名
36                 copy.DestinationTableName = "T_TelNum";
37                 //数据源与目的数据表的映射关系
38                 copy.ColumnMappings.Add("StartNum", "StartNum");
39                 copy.ColumnMappings.Add("TelArea", "TelArea");
40                 copy.ColumnMappings.Add("TelType", "TelType");
41                 copy.ColumnMappings.Add("AreaNum", "AreaNum");
42 
43                 copy.WriteToServer(table);
44             }
45             double totoleTime = DateTime.Now.Second- start.Second;
46             

 

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

发表评论
用户名: 匿名