当数据量很大时,如果使用cmd.ExecuteNonQuery()循环插入数据,速度会非常慢,此时可以使用SqlBulkCopy来进行批量插入,可以极大提高插入速度。
以下是源代码示例:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";
if (ofd.ShowDialog() != true)
{
return;
}
else
{
string[] tels = File.ReadAllLines(ofd.FileName,Encoding.Default);
string connStr = @"Data Source=.\SQLExpress;Initial Catalog=practice;User ID=sa;Password=381213";
DateTime startTime = DateTime.Now;
DataTable table=new DataTable();//创建DataTable
table.Columns.Add("tel"); //给DataTable添加列
table.Columns.Add("area");
table.Columns.Add("telType");
table.Columns.Add("areaNum");
for (int i = 1; i < tels.Length; i++)
{
string[] s = tels[i].Split('\t');
string startTelNum = s[0];
string area = s[1].Trim('"');
string telType = s[2].Trim('"');
string areaNum = s[3].Trim('"');
DataRow row=table.NewRow();//创建新行
row["tel"]=startTelNum;//给对应的列赋值
row["area"] = area;//给对应的列赋值
row["telType"] = telType;//给对应的列赋值
row["areaNum"] = areaNum;//给对应的列赋值
table.Rows.Add(row);//将row添加到DataTable中
}
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr)) //创建一个SqlBulkCopy实例,connStr是数据库连接字符串
{
bulkCopy.DestinationTableName="telNum";//指明服务器上的目标表名
bulkCopy.ColumnMappings.Add("tel","telNum");//添加DataTable中列名和目标表中列的映射,前一个参数是DataTable的列名,后一个是对应的目标表的列名
bulkCopy.ColumnMappings.Add("area","area");
bulkCopy.ColumnMappings.Add("telType","telType");
bulkCopy.ColumnMappings.Add("areaNum","areaNum");
bulkCopy.WriteToServer(table);
}
}