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

      

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

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

     

  • 相关阅读:
    VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
    一些 Windows 系统不常见的 鼠标光标常数
    加载MSCOMCTL.OCX错误处理的几个关键
    如何快速掌握一门技术
    《将博客搬至CSDN》
    日期小demo
    iOS崩溃解决记录
    Swift基础语法
    iOS端APP切图命名规范大全
    PHP案例:学生信息管理系统
  • 原文地址:https://www.cnblogs.com/myloveblogs/p/7659854.html
Copyright © 2011-2022 走看看