使用SqlBulkCopy提高批量插入数据库性能
SqlBulkCopy是.Net提供的一个可以讲一个表复制到数据库的解决方案,其性能相比INSERT方式插入数据库要快得多,但是,由于实现机制,只适用于多条数据同时插入数据表,不适用于其他操作。
因为是表复制操作,必须有一个数据源,(目标即我们的SqlServer数据库)我们可以讲数据加载到DataTable或可使用IDataReader实例的对象中方可操作。
为了方便操作我们先生成了一个实体类,方便数据库操作。
class Person { public Guid PersonId { get; set; } public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } }
我们先看SqlCommand的数据插入代码:
static void InsertBySqlCommand() { //准备测试数据 List<Person> lists = new List<Person>(); for (int i = 0; i < 1000; i++) { Person p = new Person(); p.PersonId = Guid.NewGuid(); p.Age = i + 1; p.Name = "姓名" + (i + 1); p.Address = "地址" + (i + 1); lists.Add(p); } Stopwatch sw = new Stopwatch(); sw.Start(); using (SqlConnection conn = new SqlConnection("Data Source=.;uid=sa;pwd=1234;Initial Catalog=demo")) { conn.Open(); foreach (Person p in lists) { //插入数据 using (SqlCommand cmd = new SqlCommand("INSERT INTO Person(PersonId,Name,Age,Address) VALUES(@PersonId,@Name,@Age,@Address) ", conn)) { cmd.Parameters.Add(new SqlParameter("PersonId", p.PersonId)); cmd.Parameters.Add(new SqlParameter("Name", p.Name)); cmd.Parameters.Add(new SqlParameter("Age", p.Age)); cmd.Parameters.Add(new SqlParameter("Address", p.Address)); cmd.ExecuteNonQuery(); } } } sw.Stop(); Console.WriteLine("SqlCommand方式插入1000条数据,用时" + sw.ElapsedMilliseconds); }
下面是SqlBulkCopy的数据插入代码:
static void InsertBySqlBulkCopy() { //准备测试数据 List<Person> lists = new List<Person>(); for (int i = 0; i < 1000; i++) { Person p = new Person(); p.PersonId = Guid.NewGuid(); p.Age = i + 1; p.Name = "姓名" + (i + 1); p.Address = "地址" + (i + 1); lists.Add(p); } Stopwatch sw = new Stopwatch(); sw.Start(); //将List转换到DataTable DataTable dt = new DataTable(); dt.Columns.Add("PersonId", typeof(Guid)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); dt.Columns.Add("Address", typeof(string)); foreach (Person p in lists) { DataRow row = dt.NewRow(); row["PersonId"] = p.PersonId; row["Name"] = p.Name; row["Age"] = p.Age; row["Address"] = p.Address; dt.Rows.Add(row); } using (SqlConnection conn = new SqlConnection("Data Source=.;uid=sa;pwd=1234;Initial Catalog=demo")) { conn.Open(); using (SqlBulkCopy sbc = new SqlBulkCopy(conn)) { sbc.DestinationTableName = "Person"; sbc.WriteToServer(dt);//插入数据 } } sw.Stop(); Console.WriteLine("SqlBulkCopy方式插入1000条数据,用时" + sw.ElapsedMilliseconds); }
运行结果:
从结果上很容易看出,SqlBulkCopy要比SqlCommand方式插入数据快得多。