SqlBulkCopy 批量插入
方式一:
public void Sqlbulkcopy<T>(List<T> data, string tableName)
{
List<PropertyInfo> pList = new List<PropertyInfo>();//创建属性的集合
DataTable dt = new DataTable();
//把所有的public属性加入到集合 并添加DataTable的列
var pros = typeof(T).GetProperties();
//获得反射的入口(typeof())
Array.ForEach<PropertyInfo>(pros, p =>
{
pList.Add(p); //所有公共属性接入属性集合
dt.Columns.Add(p.Name, p.PropertyType);//属性加入表
});
foreach (var item in data)
{
DataRow row = dt.NewRow(); //创建一个DataRow实例
//给row 赋值,item是一个对象,属性是row的值,循环每个属性并从item中获取该属性的值
pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
dt.Rows.Add(row); //加入到DataTable
}
using (SqlConnection conn = new SqlConnection(Database.ConnectionString))
{
conn.Open();
SqlTransaction bulkTrans = conn.BeginTransaction();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, bulkTrans)
{
DestinationTableName = tableName /*设置数据库目标表名称*/,
BatchSize = dt.Rows.Count/*每一批次中的行数*/
})
{
if (dt != null)
{
try
{
foreach (DataColumn dc in dt.Columns)
{
///映射列
bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
}
bulkCopy.WriteToServer(dt);
bulkTrans.Commit();
}
catch (Exception ex)
{
bulkTrans.Rollback();
//SQLLog.Error
throw ex;
}
}
}
}
}
方式二:
public void Sqlbulkcopy<T>(List<T> data, string tableName)
{
List<PropertyInfo> pList = new List<PropertyInfo>();//创建属性的集合
DataTable dt = new DataTable();
//把所有的public属性加入到集合 并添加DataTable的列
var pros = typeof(T).GetProperties();
//获得反射的入口(typeof())
Array.ForEach<PropertyInfo>(pros, p =>
{
pList.Add(p); //所有公共属性接入属性集合
dt.Columns.Add(p.Name, p.PropertyType);//属性加入表
});
foreach (var item in data)
{
DataRow row = dt.NewRow(); //创建一个DataRow实例
//给row 赋值,item是一个对象,属性是row的值,循环每个属性并从item中获取该属性的值
pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
dt.Rows.Add(row); //加入到DataTable
}
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(Database.ConnectionString, SqlBulkCopyOptions.UseInternalTransaction)
{
DestinationTableName = tableName /*设置数据库目标表名称*/,
BatchSize = dt.Rows.Count/*每一批次中的行数*/
})
{
if (dt != null)
{
try
{
foreach (DataColumn dc in dt.Columns)
{
///映射列
bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
}
bulkCopy.WriteToServer(dt);
}
catch (Exception ex)
{
throw ex;
}
}
}
}
方法未测试(请自行测试)
这两种方法主要的区别是在与


浙公网安备 33010602011771号