在数据库导入过程中,如果小数据就没什么影响,如果过大数据,那么一条一条的插入,是不是很麻烦啊,而且浪费时间,
需要 引用命名空间using System.Data.SqlClient;using System.Data;
OpenFileDialog ofd = new OpenFileDialog();//选择文件,准备插入数据库
ofd.Filter = "文本文件|*.txt";
if (ofd.ShowDialog() == false)
{
return;
}
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();//把导入的数据先弄成数组
string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;//这是连接数据库的App文件,
//
<connectionStrings>//这是App中的文件信息
<add name="SQL" connectionString="server=.;database=ADO.NET;Integrated Security=true" />
</connectionStrings>
//
DataTable table = new DataTable();
table.Columns.Add("StartTelNum");//这三个列必须创建,否则就会报错!这都创建的是要插入的列的别名,
table.Columns.Add("City");
table.Columns.Add("TelType");
DateTime startTime = DateTime.Now;//获取运行当前时间
//for循环里面,就是对要插入的数据进行一下处理,我处理的是手机号码归属地,你们可以处理别的,在上面,创建列的时候,也是,自己需求来
for (int i = 1; i < lines.Count(); i++)//跳过第一行表头
{
string line = lines[i];
//注意,文件里是按照制表符分割的,不是字符串
string[] strs = line.Split('\t');//VS里“\t”的为制表符
string startTelNum = strs[0];//第一个是号码段
string city = strs[1];//第三个个是号码所属城市
city = city.Trim('"');//去掉两边的双引号
string telType = strs[2];//第二个是号码网络类型
telType = telType.Trim('"');//去掉两边的双引号
DataRow row = table.NewRow();//创建一个DataRow对象
row["StartTelNum"] = startTelNum;//这个“StartTelNum”会提示没有,所以要在前面创建一个列
row["City"] = city;
row["TelType"] = telType;
//到这一步,还没有加到table里面,下面加入
table.Rows.Add(row);//NewRow只是创建,没有插入
}
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conStr))//然后就可以插入了,虽然有些麻烦,但是,效率极高,总比一条一条的插入强吧。
{
bulkCopy.DestinationTableName = "T_TelNum";//表示的是要批量把数据插入到哪个表中
//建立数据应用字段和DataTable字段的应用关系
bulkCopy.ColumnMappings.Add("StartTelNum", "StartTelNum");
bulkCopy.ColumnMappings.Add("City", "TelArea");
bulkCopy.ColumnMappings.Add("TelType", "TelType");//添加DataTable中列明和数据库表中列名的映射
bulkCopy.WriteToServer(table);//批量把数据写到服务器中
}
TimeSpan ts = DateTime.Now - startTime;//获取插入数据完毕后用了多少事件
MessageBox.Show(ts.ToString());