SqlBulkCopy的使用

1、问题:导入大数据量到数据库,用我们普通的SqlHelper来做是每插入一条都是打开连接关闭连接,这样太慢,因此我们会想到让SqlConnection一直打开直到所有数据都插入完成再关闭连接。但是根据数据库连接池,这样速度依然很慢。

2、解决办法: .Net给我们提供了SqlBulkCopy来一次性执行插入,效率和速度要高很多

3、实例:

如:导入手机号码归属地信息

准备材料:"手机号段归属地数据库.txt"文档。

如在Winform中添加按钮,按钮的点击事件中实现。

#code

private void btn_import_Click(object sender, RoutedEventArgs e)
        {
            //先读取文件
            //打开对话框,选择文件。
            OpenFileDialog ofd = new OpenFileDialog(); 
            ofd.Filter = "文本文件|*.txt";
            if (ofd.ShowDialog()==false)
            {
                return;
            } 
            string[] lines = File.ReadLines(ofd.FileName,Encoding.Default).ToArray();

            DateTime startTime = DateTime.Now;

            //新建表
            DataTable dtTable = new DataTable();
            //给表添加列
            dtTable.Columns.Add("StartTellName");
            dtTable.Columns.Add("TellType");
            dtTable.Columns.Add("TellArea");

            //遍历每一行数据,处理数据,添加到行(DataRow)中
            foreach (string line in lines)
            {
                string[] strs = line.Split(\t);//\t制表符
                string startTellNum = strs[0];
                string tellType = strs[1].Trim(");//去除两边的"
                string tellArea = strs[2].Trim(");
                DataRow row = dtTable.NewRow();
                row["StartTellName"] = startTellNum;//给字段赋值
                row["TellType"] = tellType;
                row["TellArea"] = tellArea;
                dtTable.Rows.Add(row);//添加到一行中
            }

            //获取配置文件中连接字符串
            string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;

            //SqlBulkCopy是实现IDisposable接口的,所以必须用using
            using (SqlBulkCopy bulk = new SqlBulkCopy(connstr))
            {
                bulk.DestinationTableName = "T_TellNum";//指定表名
                //本地列名与数据库列名建立连接
                bulk.ColumnMappings.Add("StartTellName", "starttellnum");
                bulk.ColumnMappings.Add("TellType", "telltype");
                bulk.ColumnMappings.Add("TellArea", "tellarea");
                //把dtTable的数据写到数据库
                bulk.WriteToServer(dtTable);
            }
            TimeSpan ts = DateTime.Now - startTime;
            //计算时间
            MessageBox.Show(ts.ToString());
        }

#code

4、数据库字段

  id bigint primary key,

     starttellnum nvarchar(30),

     telltype  nvarchar(30),

     tellarea  nvarchar(30),

5、可能遇到的问题

     技术分享

    解决办法:请检查建立连接字段时字段名是否都正确。

 

   技术分享

   解决方法

    1,首先检查数据库表的字段是否过小

    2,检查数据中是否有类似单引号的数据,做一下过滤

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。