方式一:
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; } } } }
方法未测试(请自行测试)
这两种方法主要的区别是在与