C#高效插入数据库数据(几十万条以上的)

  1. 我们经常需要对数据库做的两件事:新增、查询
  2. 新增
    • 逐条新增数据模式
    •             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();
                }
            }
}
  • 查询

猜你喜欢

转载自www.cnblogs.com/micc/p/10677916.html