C# 数据批量插入到数据库SqlBulkCopy(源数据类型:List<T> Or DataTable)
/*_____________________ List<T>类型数据 To Sql_______________________________*/
/// <summary>
/// Sqlbulkcopies the specified SMS.批量插入到数据库
/// </summary>
/// <param name="data">list类型数据.</param>
/// <param name="sqlconn">数据库连接字符串.</param>
private void Sqlbulkcopy(List<T> data, SqlConnection sqlconn)
{
#region 待处理数据初始化处理
List<PropertyInfo> pList = new List<PropertyInfo>();//创建属性的集合
DataTable dt = new DataTable();
//把所有的public属性加入到集合 并添加DataTable的列
Array.ForEach<PropertyInfo>(typeof(T).GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); }); //获得反射的入口(typeof()) //要对 array 的每个元素执行的 System.Action。
foreach (var item in data)
{
DataRow row = dt.NewRow(); //创建一个DataRow实例
pList.ForEach(p => row[p.Name] = p.GetValue(item, null)); //给row 赋值
dt.Rows.Add(row); //加入到DataTable
}
#endregion
#region 批量插入数据库 SqlBulkCopy声明及参数设置
SqlBulkCopy bulk = new SqlBulkCopy(sqlconn.ToString(), SqlBulkCopyOptions.UseInternalTransaction) { DestinationTableName = "TableName" /*设置数据库目标表名称*/, BatchSize = dt.Rows.Count /*每一批次中的行数*/ };
bulk.ColumnMappings.Add("ID", "ID"); //设置数据源中的列和目标表中的列之间的映射关系
bulk.ColumnMappings.Add("name", "name");//ColumnMappings.Add("源数据表列名称", "目标表数据列名称");
bulk.ColumnMappings.Add("sex", "sex");
bulk.ColumnMappings.Add("phone", "phone");
.
.
.
#endregion
bulk.WriteToServer(dt);
if (bulk != null)
{
bulk.Close();
}
}
/*_____________________ DataTable类型数据 To Sql_______________________________*/
/// <summary>
/// Sqlbulkcopies the specified SMS.批量插入到数据库
/// </summary>
/// <param name="dt">DataTable类型带插入数据</param>
/// <param name="sqlconn">数据库连接字符串</param>
private void Sqlbulkcopy(DataTable dt, SqlConnection sqlconn)
{
#region 批量插入数据库 SqlBulkCopy声明及参数设置
SqlBulkCopy bulk = new SqlBulkCopy(sqlconn.ToString(),
SqlBulkCopyOptions.UseInternalTransaction) { DestinationTableName =
"ENG_FailSendSMS" /*设置数据库目标表名称*/, BatchSize = dt.Rows.Count /*每一批次中的行数*/
};
bulk.ColumnMappings.Add("ID", "ID"); //设置数据源中的列和目标表中的列之间的映射关系
bulk.ColumnMappings.Add("name", "name");//ColumnMappings.Add("源数据表列名称", "目标表数据列名称");
bulk.ColumnMappings.Add("sex", "sex");
bulk.ColumnMappings.Add("phone", "phone");
.
.
.
#endregion
bulk.WriteToServer(dt);
if (bulk != null)
{
bulk.Close();
}
}
补充:SqlBulkCopy ColumnMappings 映射列名是敏感大小写的!