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,检查数据中是否有类似单引号的数据,做一下过滤
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。