pre { /*控制代码不换行*/ white-space: pre; word-wrap: normal; }

使用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提高批量插入数据库的性能

从结果上很容易看出,SqlBulkCopy要比SqlCommand方式插入数据快得多。

代码下载

posted @ 2011-08-26 22:46  monkey's  阅读(828)  评论(2编辑  收藏  举报