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

      

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

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

     

  • 相关阅读:
    css样式的调用方法
    分页的实现 (占个位)
    获取当前脚本的进程PID号
    Mail插件 (占个位 后面补充)
    ovs-vswitchd的启动分析
    OPCServer:使用Matrikon OPC Server Simulation
    OPCServer:使用KEPServer
    Java OPC 代码
    OPC 协议认识
    OPC 技术学习总结
  • 原文地址:https://www.cnblogs.com/myloveblogs/p/7659854.html
Copyright © 2011-2022 走看看