一条一条的插入数据和批量插入数据的对比,SqlBulkCopy将减少相当多插入数据的时间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Configuration;
using System.Data.SqlClient;
using Microsoft.Win32; //OpenFileDialog类 需要
using System.IO; //File类需要
using System.Data;
namespace 将txt文件中的数据批量插入数据库
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 插入很慢的方式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, RoutedEventArgs e)
{
//读取本地.txt文本文件里的数据
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";
if (ofd.ShowDialog() == false)
{
return;
}
//读出所有行数据存到数组中
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
//连接数据库字符串
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
DateTime startTime = DateTime.Now;//开始插入数据记录时间
using (SqlConnection conn=new SqlConnection(connStr))
{
conn.Open();
//取出每一行数据
for (int i = 0; i < lines.Length; 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('"');
//数据库连接池:ADO.Net会尽可能的复用连接池中的连接
using (SqlCommand cmd= conn.CreateCommand())
{
cmd.CommandText = "insert into T_TelNum(StarTelNum,TelType,TelArea) values(@StarTelNum,@TelType,@TelArea)";
cmd.Parameters.Add(new SqlParameter("@StarTelNum", startTelNum));
cmd.Parameters.Add(new SqlParameter("@TelType", telType));
cmd.Parameters.Add(new SqlParameter("@TelArea", city));
cmd.ExecuteNonQuery();
}
TimeSpan ts = DateTime.Now - startTime;//DateTime相减得到TimeSpan类型
//ts.TotalSeconds;时间段代表的总秒数
double ellapsedSec = ts.TotalSeconds;//已经耗用的秒数
//(ellapsedSec / (i + 1)) * lines.Length 先乘后除更精确
double totalSec = lines.Length*ellapsedSec / (i + 1);//估计需要的总秒数
}
}
}
/// <summary>
/// 高效批量插入数据的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, RoutedEventArgs e)
{
//一、读取本地.txt文本文件里的数据
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";
if (ofd.ShowDialog() == false)
{
return;
}
//二、读出所有行数据存到数组中
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
//连接数据库字符串
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
DateTime startTime = DateTime.Now;//开始插入数据记录时间
//三、创建一个表
DataTable table = new DataTable();
//添加列
table.Columns.Add("StartTelNum");
table.Columns.Add("City");
table.Columns.Add("TelType");
//四、取出每一行数据
for (int i = 0; i < lines.Length; 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对象
DataRow row = table.NewRow();
row["StartTelNum"] = startTelNum;//一定要在一开始创建table.Columns添加列
row["City"] = city;
row["TelType"] = telType;
table.Rows.Add(row);//添加到table中,NewRow只是创建,没有添加
}
//六、开始批量插入数据
//SqlBulkCopy是大数据量拷贝的应用类
//如果实现了IDisposable接口的都可以用using
using (SqlBulkCopy bulkCopy=new SqlBulkCopy(connStr))
{
//1.要插入数据的表名称
bulkCopy.DestinationTableName = "T_TelNum";
//2.添加DataTable中列名和数据库表中列名的映射
//第一个参数是DataTable中的列名,第二个参数是数据库表中的列名
bulkCopy.ColumnMappings.Add("StartTelNum", "StarTelNum");
bulkCopy.ColumnMappings.Add("City", "TelArea");
bulkCopy.ColumnMappings.Add("TelType", "TelType");
//3.将数据批量写到服务器中
bulkCopy.WriteToServer(table);
}
TimeSpan ts = DateTime.Now - startTime;//所用的时间
MessageBox.Show(ts.ToString());
}
}
}
将txt文件中的数据批量插入到数据库中SqlBulkCopy
最新推荐文章于 2019-08-19 16:03:00 发布