SQLBulkCopy,用于数据库之间大批量的数据传递。通常用于新,旧数据库之间数据的更新。即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来。
1.初始化SqlBulkCopy对象,用新的连接作为参数。
SqlBulkCopy bulkCopy = new SqlBulkCopy(链接字符串);
2.数据源与目的数据表的映射关系(列名要对应)
bulkCopy.ColumnMappings.Add("source",'"dest")
3.设置目标表名
bulkCopy.DestinationTableName = 目标表名;
4.设置一次性处理的行数。这个行数处理完后,会激发SqlRowsCopied()方法。默认为1
bulkCopy.NotifyAfter = 10;
5.传输数据
bulkCopy.WriteToServer(sdr);
目前有一个txt文档,里面记录了大量的数据
然后我们用常见的数据库操作将其导入数据库中
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "txt文件|*.txt";
if (ofd.ShowDialog() == false)
{ return;
}
//读取txt中的内容,然后拼接字符串
//readlines可以一行一行读取内容,并保留内容中的换行符,而 ReadAllLines 时,必须等待整个字符串数组返回后才能访问该数组。 因此,在处理非常大的文件时,ReadLines 可能更高效。
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ToString()))
{
con.Open();
//当前时间
DateTime startTime = DateTime.Now;
for(int i=;i<=lines.Length;i++)
{
string line=lines[i];
string[] strs = line.Split('\t'); string startNum = strs[]; string city = strs[];
city = city.Trim('"'); string type = strs[];
type = type.Trim('"'); string areaNum = strs[];
areaNum = areaNum.Trim('"');
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = @"insert into T_TelNum(StartNum,TelArea,TelType,AreaNum)
values(@StartNum,@TelArea,@TelArea,@AreaNum)";
cmd.Parameters.Add(new SqlParameter("@StartNum",startNum));
cmd.Parameters.Add(new SqlParameter("@TelArea", city));
cmd.Parameters.Add(new SqlParameter("@TelType", type));
cmd.Parameters.Add(new SqlParameter("@AreaNum", areaNum));
cmd.ExecuteNonQuery();
}
//执行到第i条的时间
DateTime nowTime = DateTime.Now;
TimeSpan ts = nowTime - startTime;
//double totalTime=(ts.TotalSeconds/(i+1))*(lines.Length)/60; //需要总秒数
double totalTime = ts.TotalSeconds * lines.Length / (i + );
运行项目,查看需要完成的总秒数。
一共将要运行时间1671秒,将近28分钟。
然后我们用SqlBulkCopy来读取数据并存储。
//创建一个DatatTable用于传递参数。
DataTable table = new DataTable();
//创建列与数据库对应上
table.Columns.Add("StartNum");
table.Columns.Add("TelArea");
table.Columns.Add("TelType");
table.Columns.Add("AreaNum");
DateTime start = DateTime.Now;
for (int i = ; i <= lines.Length; i++)
{
string line = lines[i];
string[] strs = line.Split('\t'); string startNum = strs[]; string city = strs[];
city = city.Trim('"'); string type = strs[];
type = type.Trim('"'); string areaNum = strs[];
areaNum = areaNum.Trim('"');
DataRow row = table.NewRow();
row[] = startNum;
row[] = city;
row[] = type;
row[] = areaNum; } using (System.Data.SqlClient.SqlBulkCopy copy = new System.Data.SqlClient.SqlBulkCopy(ConfigurationManager.ConnectionStrings[].ToString()))
{
//目的地的数据表名
copy.DestinationTableName = "T_TelNum";
//数据源与目的数据表的映射关系
copy.ColumnMappings.Add("StartNum", "StartNum");
copy.ColumnMappings.Add("TelArea", "TelArea");
copy.ColumnMappings.Add("TelType", "TelType");
copy.ColumnMappings.Add("AreaNum", "AreaNum"); copy.WriteToServer(table);
}
double totoleTime = DateTime.Now.Second- start.Second;
不难发现只用了3秒钟,所以可以看出在对大数据处理时最好使用SqlBulkCopy来进行操作!