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、可能遇到的问题

    

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

 

   http://images.cnblogs.com/cnblogs_com/kkun/WindowsLiveWriter/Stringnvarchar_10B96/image_2.png

   解决方法

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

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

你可能感兴趣的:(copy)