- 我们经常需要对数据库做的两件事:新增、查询
- 新增
- 逐条新增数据模式
-
Stopwatch s2 = new Stopwatch(); s2.Start(); for (int i = 0; i < 100000; i++) { //方法一36s-37s这样的时间结果36192 40860 37434 string sql = "insert into student (Name,Sex,BirthDate) values('张三','男','2019-03-29')"; CreateSql(sql); } s2.Stop(); textBox7.Text = s2.ElapsedMilliseconds.ToString();
逐条逐步骤新增,共累计增加十万条,结束,得到结果是在36秒左右时间新增完成十万条数据。
-
- 拼接模式新增数据
-
Stopwatch s = new Stopwatch(); s.Start(); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < 100000; i++) { sBuilder.Append("insert into student (Name,Sex,BirthDate) values('张三','男','2019-03-29');"); } s.Stop(); CreateSql(sBuilder.ToString()); textBox6.Text = s.ElapsedMilliseconds.ToString();
用StringBuilder拼接十万个sql字符串,在交给插入代码执行,十万条总耗时约27秒-28秒,可见虽然比逐条插入快了约十秒,但是效果还不是很理想
- 高效插入模式SqlBulkCopy
-
Stopwatch s = new Stopwatch(); s.Start(); DataTable dt = new DataTable(); dt.TableName = "Student"; dt.Columns.Add("ID"); dt.Columns.Add("Name"); dt.Columns.Add("Sex"); dt.Columns.Add("BirthDate"); DataRow dr = null; for (int i = 0; i <100000; i++) { dr = dt.NewRow(); dr["ID"] = i; dr["Name"] = "张三"; dr["Sex"] = "男"; dr["BirthDate"] = "2019-03-29"; dt.Rows.Add(dr); } CreateSql(dt); s.Stop(); textBox7.Text = s.ElapsedMilliseconds.ToString();
先拼接DataTable,然后动态创建十万行DataRow,这样DataTable就组成了数据源,直接使用SqlBulkCopy来插入数据,此时十万条数据新增只需要1.1秒-1.3秒左右,速度很快了。
- SqlBulkCopy代码:
-
private void CreateSql(DataTable dt) { using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;DataBase=student_micc")) { if (conn.State == ConnectionState.Closed) { conn.Open(); } SqlBulkCopy sqlCopy = new SqlBulkCopy(conn); sqlCopy.BatchSize = dt.Rows.Count; sqlCopy.DestinationTableName = "Student"; sqlCopy.WriteToServer(dt); sqlCopy.Close(); } }
普通Ado.Net连接串插入
private void CreateSql(string sql) { using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;DataBase=student_micc")) { if (conn.State == ConnectionState.Closed) { conn.Open(); } using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.CommandTimeout = 200; cmd.ExecuteNonQuery(); } } }
- 查询