又看了些资料,发现对于说参数存在的问题可以把SqlCommand的创建放到For循环里,可以只连一次数据库,但是效率还是没提高。效率的问题不在于对数据库的开关,而是还是逐条地插入数据。而且数据库连接有数据库连接池,并不是每次都创建一个连接。可以用SqlBulkCopy实现批量插入。先把数据存到一个DataTable里,然后WriteToServer(datatable);搞定,大约10秒钟,25万多条数据。
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;//获取连接的字符串
using (SqlConnection sqlConn = new SqlConnection(connStr))//创建一个数据库连接
{
sqlConn.Open();//打开链接
//读取文件部分
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";//过滤器
ofd.InitialDirectory = @"D:\C#Program\TelAreaSqlBulkCopy";//创建初始目录
if (ofd.ShowDialog() != true)
{
return;//如果,没选则的话
}
string fileName = ofd.FileName;//获得文件名
IEnumerable lines = File.ReadLines(fileName, Encoding.Default);//读取全部行,是 IEnumerable
List strs = lines.ToList();//转一下类型
DataTable datatable = new DataTable();//创建一个表,等会把读的数据存进去,有三列入下
datatable.Columns.Add("NumStart");
datatable.Columns.Add("Area");
datatable.Columns.Add("NumType");
DateTime datatime1 = DateTime.Now;
//利用for 把数据插入Datatable
for (int i = 1; i < strs.Count; i++)//第一行是列名,不要,所以i=1
{
string[] str = strs[i].Split('\t');//分割字符串
string NumStart = str[0];
string Area = str[1].Trim('"');
string NumType = str[2].Trim('"');
//把数据加入dataTable
DataRow newRow = datatable.NewRow();
newRow["NumStart"] = NumStart;
newRow["Area"] = Area;
newRow["NumType"] = NumType;
datatable.Rows.Add(newRow);
}
DateTime datatime2 = DateTime.Now;
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlConn))//利用连接创建一个SqlBulkCopy
{
sqlBulkCopy.DestinationTableName = "T_TelAreaFull";
sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("NumStart", "NumStart"));
sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Area", "Area"));
sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("NumType", "NumType"));
sqlBulkCopy.WriteToServer(datatable);
}
DateTime datatime3 = DateTime.Now;
TimeSpan timespan1 = datatime2 - datatime1;
TimeSpan timespan2 = datatime3 - datatime2;
timespan1.TotalSeconds.ToString();
timespan2.TotalSeconds.ToString();
MessageBox.Show("第一阶段时间" + timespan1.TotalMinutes.ToString() + "第二阶段时间" + timespan2.TotalSeconds.ToString());
}