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

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

SqlBulkCoy和普通数据库操作执行速度对比_第1张图片

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

 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);

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

SqlBulkCoy和普通数据库操作执行速度对比_第2张图片

一共将要运行时间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             

SqlBulkCoy和普通数据库操作执行速度对比_第3张图片

 

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

转载于:https://www.cnblogs.com/magicyu/p/3292599.html

你可能感兴趣的:(SqlBulkCoy和普通数据库操作执行速度对比)