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文档,里面记录了大量的数据
然后我们用常见的数据库操作将其导入数据库中
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来进行操作!