将txt文件中的数据批量插入到数据库中SqlBulkCopy

一条一条的插入数据和批量插入数据的对比,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());
        }
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值