使用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方式插入数据快得多。

代码下载

你可能感兴趣的:(copy)