博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库
阅读量:5064 次
发布时间:2019-06-12

本文共 6935 字,大约阅读时间需要 23 分钟。

///     /// 将泛类型集合List类转换成DataTable    ///     /// 泛类型集合    /// 
public static DataTable ListToDataTable
(List
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
(IList
list) { DataTable table = CreateTable
(); 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
ConvertTo
(IList
rows) { IList
list = null; if (rows != null) { list = new List
(); foreach (DataRow row in rows) { T item = CreateItem
(row); list.Add(item); } } return list; } public static IList
ConvertTo
(DataTable table) { if (table == null) return null; List
rows = new List
(); foreach (DataRow row in table.Rows) rows.Add(row); return ConvertTo
(rows); } //Convert DataRow into T Object public static T CreateItem
(DataRow row) { string columnName; T obj = default(T); if (row != null) { obj = Activator.CreateInstance
(); 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
() { 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中的数据批量插入数据库中        ///         /// 使用SqlBulkCopy将DataTable中的数据批量插入数据库中        ///         /// 数据库中对应的表名        /// 数据集        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
(); } trans.Commit(); }

 

使用SqlBulkCopy将DataTable中的数据批量插入数据库中

转载于:https://www.cnblogs.com/shy1766IT/p/5349142.html

你可能感兴趣的文章
Android bitmap图片处理
查看>>
Android应用程序进程启动过程的源代码分析
查看>>
adb logcat 命令行用法
查看>>
Redis学习手册(Key操作命令)
查看>>
模板统计LA 4670 Dominating Patterns
查看>>
泛型第23条:请不要在新代码中使用原生态类型
查看>>
非对称加密
查看>>
bzoj 3413: 匹配
查看>>
从下周开始就要采用网上记录值班日志了
查看>>
在qq中可以使用添加标签功能
查看>>
eclipse 自定义布局
查看>>
团队项目开发客户端——登录子系统的设计
查看>>
【AppScan心得】IBM Rational AppScan 无法记录登录序列
查看>>
[翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
查看>>
简化通知中心的使用
查看>>
SpringMVC的@Validated校验注解使用方法
查看>>
Python之os模块
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
【蓝桥杯】PREV-21 回文数字
查看>>
html 简介
查看>>