SqlBulkCopy实现大容量数据快速插入数据库中

一般情况下,我们手写sqlhelper类,在此类中定义一个数据插入到数据库的一个方法。将数据库连接密封在using()的语句中。using显示了Idispose接口。可以及时释放数据库连接资源。代码如下:

//以下为方法中语句

using(Sqlconnection conn=new Sqlconnection(constr))//"constr"为连接字符串

{

     conn.Open();

     using(SqlCommand cmd=conn.CreateCommand())

     {

          cmd.CommandText=sql;//"sql"为插入数据库操作语句

          cmd.ExecuteNonquery();

     }

}

但是这样的数据插入操作,面对大批量的数据插入时,所耗费的时间很长。有没有更好的方法能够实现数据的快速插入呢?

此时,微软早已为我们准备好了一个方法,可以实现数据的快速插入。

代码(我的项目的部分代码)如下:

      string constr = "Data Source=.;Initial Catalog=ceshi;Integrated Security=true";
            using(SqlConnection conn=new SqlConnection(constr))
            {
                conn.Open();
                DateTime starttime = System.DateTime.Now;
                using(SqlCommand cmd=conn.CreateCommand())
                {
                    OpenFileDialog ofd = new OpenFileDialog();
                    ofd.Filter = "文本文件|*.txt";
                    if (ofd.ShowDialog() == false)
                    {
                        return;
                    }
                    string filename = ofd.FileName;
                    string[] lines = File.ReadLines(filename,Encoding.Default).ToArray();
                    DataTable table = new DataTable();
                    table.Columns.Add("tel_id");
                    table.Columns.Add("area");
                    table.Columns.Add("tel_type");
                    table.Columns.Add("area_tel");
                    for (int i = 1; i < lines.Count(); i++)
                    {
                        string line=lines[i];
                        string[] liness = line.Split(' ');
                        string tel_id = liness[0];
                        string area=liness[1];
                        string tel_type=liness[2];
                        string area_tel = liness[3];
                        DataRow row = table.NewRow();
                        row["tel_id"]=tel_id;
                        row["area"] = area;
                        row["tel_type"] = tel_type;
                        row["area_tel"] = area_tel;
                        table.Rows.Add(row);
                    }
                    using(SqlBulkCopy sbc=new SqlBulkCopy(constr))//SqlBulkCopy是大批量数据复制
                    {

                          //以下括号中的第二个参数是数据库中表的字段名
                        sbc.DestinationTableName = "Tel";
                        sbc.ColumnMappings.Add("tel_id","tel_id");
                        sbc.ColumnMappings.Add("area", "area");
                        sbc.ColumnMappings.Add("tel_type", "tel_type");
                        sbc.ColumnMappings.Add("area_tel", "area_tel");
                        sbc.WriteToServer(table);
                    }
                    DateTime endtime = System.DateTime.Now;
                    TimeSpan ts = endtime - starttime;
                    double hao = ts.TotalSeconds;
                    MessageBox.Show(hao.ToString());
                }
            }

有兴趣的朋友可以试一下哦!

原文地址:https://www.cnblogs.com/panchangtao/p/3348939.html