SqlBulkCopy高效能批量插入SQL SERVER
2018-06-27 10:18:56来源:未知 阅读 ()
what
SqlBulkCopy是.NET提供的用来批量插入数据的一个类,特别是将内存中的数据一次性插入到数据库,目前只能插入到SQL SERVER数据库,数据源可以是DataTable、IDataReader
why
SqlBulkCopy插入与循环一条条插入相比,性能有巨大提升,数据越多,性能优势越明显。
测试结果:一万条数据,一条条插入要6秒,Bulk只需要0.1秒。理论上插入百万条记录也只需要1分钟以内
how
以下是测试代码:
string sourceConStr = "Data Source=192.168.1.100;Initial Catalog=A; uid=sa;pwd=sa"; string destConStr = "Data Source=.;Initial Catalog=B; uid=sa;pwd=sa"; DataTable dt = new DataTable(); public Form1() { InitializeComponent(); } private void button3_Click(object sender, EventArgs e) { dt = GetTable(); MessageBox.Show("get finish"); } private void button1_Click(object sender, EventArgs e) { string str = "queue start...! \n"; Stopwatch sw = new Stopwatch(); sw.Start(); CopyData(dt); sw.Stop(); str += "queue cost time is " + sw.ElapsedMilliseconds + "\n"; richTextBox1.Text = str; } private void button2_Click(object sender, EventArgs e) { string str = "bulk start...! \n"; Stopwatch sw = new Stopwatch(); sw.Start(); CopyDataBulk(dt); sw.Stop(); str += "bulk cost time is " + sw.ElapsedMilliseconds + "\n"; richTextBox2.Text = str; } //从数据源获取要插入的数据 private DataTable GetTable() { DataTable dt = new DataTable(); using (SqlConnection sourceConnection = new SqlConnection(sourceConStr)) { sourceConnection.Open(); SqlCommand cmd = new SqlCommand("SELECT TOP 10000 CName,PersonID,Sex,Age FROM Customer order by cid asc;", sourceConnection); cmd.CommandTimeout = 600000; SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); } return dt; } //一条条插入 private void CopyData(DataTable dt) { using (SqlConnection destinationConnection = new SqlConnection(destConStr)) { destinationConnection.Open(); foreach(DataRow reader in dt.Rows) { string sql = "INSERT INTO Customer(Name,PersonID,Sex,Age) VALUES('" + reader["Cname"].ToString() + "','" + reader["PersonID"].ToString() + "','" + reader["Sex"].ToString() + "','" + reader["Age"].ToString() + "')"; SqlCommand cmd = new SqlCommand(sql, destinationConnection); try { int re = cmd.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } //Bulk插入 private void CopyDataBulk(DataTable dt) { using (SqlConnection destinationConnection = new SqlConnection(destConStr)) { destinationConnection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection)) { //写对应关系。如旧表的CName列的数据,对应新表Name列 bulkCopy.ColumnMappings.Add("CName", "Name"); //设置目标表名 bulkCopy.DestinationTableName = "Customer"; try { bulkCopy.WriteToServer(dt); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { // reader.Close(); } } } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- JS批量操作CSS属性详细解析 2020-02-29
- js setattribute批量设置css样式的方法 2019-04-18
- 高德地图大批量数据(上万)画历史轨迹实现方案 2018-11-05
- 百度地图/高德地图大批量坐标转换结果返回顺序问题 2018-11-02
- SqlBulkCopy高效能批量插入SQL SERVER 2018-06-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash