zoukankan      html  css  js  c++  java
  • list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库

    /// <summary>
        /// 将泛类型集合List类转换成DataTable
        /// </summary>
        /// <param name="list">泛类型集合</param>
        /// <returns></returns>
        public static DataTable ListToDataTable<T>(List<T> entitys)
        {
            //检查实体集合不能为空
            if (entitys == null || entitys.Count < 1)
            {
                throw new Exception("需转换的集合为空");
            }
            //取出第一个实体的所有Propertie
            Type entityType = entitys[0].GetType();
            PropertyInfo[] entityProperties = entityType.GetProperties();
     
            //生成DataTable的structure
            //生产代码中,应将生成的DataTable结构Cache起来,此处略
            DataTable dt = new DataTable();
            for (int i = 0; i < entityProperties.Length; i++)
            {
                //dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
                dt.Columns.Add(entityProperties[i].Name);
            }
            //将所有entity添加到DataTable中
            foreach (object entity in entitys)
            {
                //检查所有的的实体都为同一类型
                if (entity.GetType() != entityType)
                {
                    throw new Exception("要转换的集合元素类型不一致");
                }
                object[] entityValues = new object[entityProperties.Length];
                for (int i = 0; i < entityProperties.Length; i++)
                {
                    entityValues[i] = entityProperties[i].GetValue(entity, null);
                }
                dt.Rows.Add(entityValues);
            }
            return dt;
        }
    public static class DataTableHelper
        {
            public static DataTable ConvertTo<T>(IList<T> list)
            {
                DataTable table = CreateTable<T>();
                Type entityType = typeof(T);
                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
                foreach (T item in list)
                {
                    DataRow row = table.NewRow();
                    foreach (PropertyDescriptor prop in properties)
                        row[prop.Name] = prop.GetValue(item);
                    table.Rows.Add(row);
                }
                return table;
            }
     
            public static IList<T> ConvertTo<T>(IList<DataRow> rows)
            {
                IList<T> list = null;
                if (rows != null)
                {
                    list = new List<T>();
                    foreach (DataRow row in rows)
                    {
                        T item = CreateItem<T>(row);
                        list.Add(item);
                    }
                }
                return list;
            }
     
            public static IList<T> ConvertTo<T>(DataTable table)
            {
                if (table == null)
                    return null;
     
                List<DataRow> rows = new List<DataRow>();
                foreach (DataRow row in table.Rows)
                    rows.Add(row);
     
                return ConvertTo<T>(rows);
            }
     
            //Convert DataRow into T Object
            public static T CreateItem<T>(DataRow row)
            {
                string columnName;
                T obj = default(T);
                if (row != null)
                {
                    obj = Activator.CreateInstance<T>();
                    foreach (DataColumn column in row.Table.Columns)
                    {
                        columnName = column.ColumnName;
                        //Get property with same columnName
                        PropertyInfo prop = obj.GetType().GetProperty(columnName);
                        try
                        {
                            //Get value for the column
                            object value = (row[columnName].GetType() == typeof(DBNull))
                            ? null : row[columnName];
                            //Set property value
                            if (prop.CanWrite)    //判断其是否可写
                                prop.SetValue(obj, value, null);
                        }
                        catch
                        {
                            throw;
                            //Catch whatever here
                        }
                    }
                }
                return obj;
            }
     
            public static DataTable CreateTable<T>()
            {
                Type entityType = typeof(T);
                DataTable table = new DataTable(entityType.Name);
                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
     
                foreach (PropertyDescriptor prop in properties)
                    table.Columns.Add(prop.Name, prop.PropertyType);
     
                return table;
            }
        }
       private void DataTable2Db(DataTable dataTable)
            {
                using (IDbConnection dbConnection = new SqlConnection(Configurator.DbConnectionString))
                {
                    if (dbConnection.State != ConnectionState.Open)
                    {
                        dbConnection.Open();
                    }
                    using (var transaction = dbConnection.BeginTransaction())
                    {
    
                        try
                        {
                            using (SqlBulkCopy bulkCopy = new SqlBulkCopy((SqlConnection)dbConnection,
                                                                                      SqlBulkCopyOptions.Default,
                                                                                      (SqlTransaction)transaction))
                            {
                                bulkCopy.DestinationTableName = "Record";
                                bulkCopy.WriteToServer(dataTable);
                            }
                            transaction.Commit();
                        }
                        catch (Exception exception)
                        {
                            transaction.Rollback();
                          
                            throw new Exception("Record持久化异常", exception);
                        }
    
                    }
                }
    
            }
    #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中  
          /// <summary>  
          /// 使用SqlBulkCopy将DataTable中的数据批量插入数据库中  
          /// </summary>  
          /// <param name="strTableName">数据库中对应的表名</param>  
          /// <param name="dtData">数据集</param>  
          public void SqlBulkCopyInsert(string strTableName, DataTable dtData)  
          {  
              string ConStr = connectionString;// 数据库连接字符串  
      
              try  
              {  
                  using (SqlBulkCopy sqlRevdBulkCopy = new SqlBulkCopy(ConStr))//引用SqlBulkCopy  
                  {  
                      sqlRevdBulkCopy.DestinationTableName = strTableName;//数据库中对应的表名  
      
                      sqlRevdBulkCopy.NotifyAfter = dtData.Rows.Count;//有几行数据  
      
                      sqlRevdBulkCopy.WriteToServer(dtData);//数据导入数据库  
      
                      sqlRevdBulkCopy.Close();//关闭连接  
                  }  
              }  
              catch (Exception ex)  
              {  
                  WriteErrorLog(ex.Message + "数据库处理出错654行。SqlBulkCopyInsert");  
                  throw (ex);  
              }  
          }  
          #endregion
    
    
    //BCP copy  
        SqlConnection conn = new SqlConnection();  
        conn.ConnectionString = "server=.;uid=dmkj_hpc;pwd=#$wlh*&1110h%c;database=DMKJ_SMS";  
        conn.Open();  
      
        SqlTransaction sqlbulkTransaction = conn.BeginTransaction();  
      
        //请在插入数据的同时检查约束,如果发生错误调用sqlbulkTransaction事务  
        SqlBulkCopy copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction);  
      
      
        copy.DestinationTableName = "T_SMS_SendInfo";  
        foreach (DataColumn dc in dataTable.Columns)  
        {  
            copy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);  
      
        }  
        try  
        {  
            copy.WriteToServer(dataTable);  
            sqlbulkTransaction.Commit();  
        }  
        catch (Exception ex)  
        {  
            sqlbulkTransaction.Rollback();  
            Console.WriteLine(ex.ToString());  
        }  
        finally  
        {  
            copy.Close();  
            conn.Close();  
        }  
    using (var conn = GetWriteDbConnection(true))
                using (var trans = conn.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    var inserted = await conn.ExecuteAsync(sql, records, trans);
                    if (inserted != records.Count)
                    {
                        trans.Rollback();
                        return new List<BarCode>();
                    }
                    trans.Commit();
                }

    使用SqlBulkCopy将DataTable中的数据批量插入数据库中https://blog.csdn.net/u013938578/article/details/78886884

  • 相关阅读:
    第六周 8.23-8.29
    Go-ethereum源码解析-Part I
    Go语言
    UVa Live 4725
    UVa 11134
    UVa 11100
    UVa 11627
    UVa Live 4794
    UVa LA 4254
    UVa 10905
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/5349142.html
Copyright © 2011-2022 走看看