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 lists = new List();
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 lists = new List();
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方式插入数据快得多。