zoukankan      html  css  js  c++  java
  • 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;
                        }
                    }
                }
            }
    

      

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

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

     

  • 相关阅读:
    安装VMware虚拟机的全过程以及基于Centos7下配置nodejs和mongodb (一)
    webpack入门1
    react心路历程
    JavaScript性能优化【转载】
    JavaScript中继承的实现
    Cookie机制和Session机制
    jQuery 最简化实现
    JavaScript 中的原型(总则)
    JS 数据类型转换以其他
    JavaScript 七种数据类型
  • 原文地址:https://www.cnblogs.com/myloveblogs/p/7659854.html
Copyright © 2011-2022 走看看