在学SqlBulkCopy之前,像数据库插入几十万条数据得近半个小时,用了微软提供的这个类,几秒就搞定了,不得不说它是如此的强悍牛逼
以下附上代码
string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; //声明配置文件中的连接字符串
OpenFileDialog ofd = new OpenFileDialog();//该类用来选择文件
ofd.Filter = "文本文件|*.txt";//文件过滤条件
if (ofd.ShowDialog() == false)//如果文件不匹配,程序跳出
{
return;
}
else//文件匹配的情况
{
DateTime t1 = DateTime.Now; //记录插入数据之前的开始时间
string fileName = ofd.FileName;// 文件的名称
string [] lines = File.ReadLines(fileName,Encoding.Default).ToArray<string>();//每行依次读取文件
string telNum = "";
string telAdd = "";
string telType = "";
string telAeraNum = "";
//SqlConnection conn = null;
DataTable table = new DataTable(); //声明表(该表存于本地服务器端,输入插入该表之后,再将这张表插入数据库)
table.Columns.Add("AreaId");//为表创建字段
table.Columns.Add("AreaAddr");
table.Columns.Add("AreaType");
table.Columns.Add("AreaNum");
for (int i = 1; i < lines.Count(); i++)//以分隔符将每行数据以数组形式重新保存,去除双引号,数组中的每个字段赋值到相应变量
{
string[] line = lines[i].Split('\t');
telNum = line[0];
telAdd = line[1].Trim('"');
telType = line[2].Trim('"');
telAeraNum = line[3];
//using (conn = new SqlConnection(connstr))
//{
// conn.Open();
// using (SqlCommand cmd = conn.CreateCommand())
// {
// cmd.CommandText = "insert into tel(telNum,telAddr,telType,telAreaNum)values(@teln,@tela,@telt,@telar);";
// cmd.Parameters.AddRange(new SqlParameter[]{new SqlParameter("@teln",telNum),new SqlParameter("@tela",telAdd),
// new SqlParameter("telt",telType),new SqlParameter("@telar",telAeraNum)});
// cmd.ExecuteNonQuery();
// }
//}
DataRow row = table.NewRow();//为表创建行
row["AreaId"] = telNum;//给行赋值
row["AreaAddr"] = telAdd;
row["AreaType"] = telType;
row["AreaNum"] = telAeraNum;
table.Rows.Add(row);//生成表格行内容,至此整张表再本地服务器端数据插入完成
}
using (SqlBulkCopy sbc = new SqlBulkCopy(connstr))//SqlBulkCopy类用法:
{
sbc.DestinationTableName = "tel";//关联到数据库的那张表
sbc.ColumnMappings.Add("AreaId", "telNum");//字段映射
sbc.ColumnMappings.Add("AreaAddr", "telAddr");
sbc.ColumnMappings.Add("AreaType", "telType");
sbc.ColumnMappings.Add("AreaNum", "telAreaNum");
sbc.WriteToServer(table);
}
TimeSpan ts = DateTime.Now - t1;//计算耗时
MessageBox.Show("导入成功,用时\t"+ts+"秒");
}
注释代码为不用SqlBuckCopy的程序