将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());        }    }}