将txt文件中的数据批量插入到数据库中SqlBulkCopy
来源:互联网 发布:淘宝店主 编辑:程序博客网 时间:2024/09/21 09:28
一条一条的插入数据和批量插入数据的对比,SqlBulkCopy将减少相当多插入数据的时间using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.Configuration;using System.Data.SqlClient;using Microsoft.Win32; //OpenFileDialog类 需要using System.IO; //File类需要using System.Data;namespace 将txt文件中的数据批量插入数据库{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /// <summary> /// 插入很慢的方式 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, RoutedEventArgs e) { //读取本地.txt文本文件里的数据 OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "文本文件|*.txt"; if (ofd.ShowDialog() == false) { return; } //读出所有行数据存到数组中 string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray(); //连接数据库字符串 string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; DateTime startTime = DateTime.Now;//开始插入数据记录时间 using (SqlConnection conn=new SqlConnection(connStr)) { conn.Open(); //取出每一行数据 for (int i = 0; i < lines.Length; i++) { string line = lines[i]; //注意文件里是按照制表符分割的,不是字符串 string[] strs = line.Split('\t');//vs里'\t'为制表符 string startTelNum = strs[0]; string city = strs[1]; city = city.Trim('"');//去掉两边的引号 string telType = strs[2]; telType = telType.Trim('"'); //数据库连接池:ADO.Net会尽可能的复用连接池中的连接 using (SqlCommand cmd= conn.CreateCommand()) { cmd.CommandText = "insert into T_TelNum(StarTelNum,TelType,TelArea) values(@StarTelNum,@TelType,@TelArea)"; cmd.Parameters.Add(new SqlParameter("@StarTelNum", startTelNum)); cmd.Parameters.Add(new SqlParameter("@TelType", telType)); cmd.Parameters.Add(new SqlParameter("@TelArea", city)); cmd.ExecuteNonQuery(); } TimeSpan ts = DateTime.Now - startTime;//DateTime相减得到TimeSpan类型 //ts.TotalSeconds;时间段代表的总秒数 double ellapsedSec = ts.TotalSeconds;//已经耗用的秒数 //(ellapsedSec / (i + 1)) * lines.Length 先乘后除更精确 double totalSec = lines.Length*ellapsedSec / (i + 1);//估计需要的总秒数 } } } /// <summary> /// 高效批量插入数据的方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, RoutedEventArgs e) { //一、读取本地.txt文本文件里的数据 OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "文本文件|*.txt"; if (ofd.ShowDialog() == false) { return; } //二、读出所有行数据存到数组中 string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray(); //连接数据库字符串 string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; DateTime startTime = DateTime.Now;//开始插入数据记录时间 //三、创建一个表 DataTable table = new DataTable(); //添加列 table.Columns.Add("StartTelNum"); table.Columns.Add("City"); table.Columns.Add("TelType"); //四、取出每一行数据 for (int i = 0; i < lines.Length; i++) { string line = lines[i]; //注意文件里是按照制表符分割的,不是字符串 string[] strs = line.Split('\t');//vs里'\t'为制表符 string startTelNum = strs[0]; string city = strs[1]; city = city.Trim('"');//去掉两边的引号 string telType = strs[2]; telType = telType.Trim('"'); //五、创建一个DataRow对象 DataRow row = table.NewRow(); row["StartTelNum"] = startTelNum;//一定要在一开始创建table.Columns添加列 row["City"] = city; row["TelType"] = telType; table.Rows.Add(row);//添加到table中,NewRow只是创建,没有添加 } //六、开始批量插入数据 //SqlBulkCopy是大数据量拷贝的应用类 //如果实现了IDisposable接口的都可以用using using (SqlBulkCopy bulkCopy=new SqlBulkCopy(connStr)) { //1.要插入数据的表名称 bulkCopy.DestinationTableName = "T_TelNum"; //2.添加DataTable中列名和数据库表中列名的映射 //第一个参数是DataTable中的列名,第二个参数是数据库表中的列名 bulkCopy.ColumnMappings.Add("StartTelNum", "StarTelNum"); bulkCopy.ColumnMappings.Add("City", "TelArea"); bulkCopy.ColumnMappings.Add("TelType", "TelType"); //3.将数据批量写到服务器中 bulkCopy.WriteToServer(table); } TimeSpan ts = DateTime.Now - startTime;//所用的时间 MessageBox.Show(ts.ToString()); } }}