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;
                    }
                }
            }
        }

  

 方法未测试(请自行测试)

这两种方法主要的区别是在与   

 

原文地址:https://www.cnblogs.com/myloveblogs/p/7659854.html