使用SqlBulkCopy实现批量插入
来源:互联网 发布:手机屏幕写字的软件 编辑:程序博客网 时间:2024/05/22 01:27
首先说下使用到的C#技术,关于使用Nopi导入Excel不叙述了,涉及到的知识C#IO流打开本地文件 C#映射主要是为了将List转化为datatable,好像也就这么两个知识点 接下来就是代码实现和分步骤解析了 第一步就是打开本地Excel文件
string filename = @"E:\Demo\SqlBulkCopy\测试.xlsx"; FileStream fileStream = File.OpenRead(filename); var lastName = Path.GetExtension(filename); string[] fileType = { ".xls", ".xlsx" }; if (!fileType.Contains(lastName.ToLower())) { System.Console.WriteLine("请上传excel文件"); } //这段是解析Excel 可以参考上一篇博文使用Nopi实现导入导出 var list = ExcelHlper.ReadExcel<Test>(new[] { "Name", "Sex", "Phone", "ContactPerson", "Age", "IdCard" }, fileStream`lastName);
解析完excel就可以获得List实体 ,
将获得到的list实体进行映射转化成datatabl
/// <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; }
获得到datatable以后 就使用SqlBulkCopy实现批量插入
/// <summary> /// 使用SqlBulkCopy批量插入数据 /// Attention: /// 表明和列名需要与数据库表统一 /// </summary> /// <param name="dt"></param> /// <param name="tableName"></param> public static void BulkInsert(DataTable dt, string tableName) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); //事务锁 SqlTransaction bulkTrans = conn.BeginTransaction(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, bulkTrans) { BatchSize = 1000, DestinationTableName = tableName }) { 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("Execute BulkCopy failed with exception:" + ex.Message + "\r\nTableName:" + tableName + "DateTime:" + DateTime.Now); throw ex; } } } } }
0 0
- 使用SqlBulkCopy实现批量插入
- 使用sqlbulkcopy批量插入
- SQLBULKCOPY批量插入数据使用
- 批量插入数据 C# SqlBulkCopy使用
- 批量插入数据 C# SqlBulkCopy使用
- 批量插入数据 C# SqlBulkCopy使用
- 批量插入数据 C# SqlBulkCopy使用
- c#使用SqlBulkCopy批量插入数据
- 批量插入数据 C# SqlBulkCopy使用
- DataTable 批量插入SqlServer数据库 使用:SqlBulkCopy
- 批量插入数据 C# SqlBulkCopy使用
- SqlBulkCopy批量数据插入
- SqlBulkCopy批量数据插入
- SqlBulkCopy批量插入数据
- SqlBulkCopy批量数据插入
- SqlBulkCopy批量插入数据
- SqlBulkCopy批量插入数据
- SqlBulkCopy来实现批量插入数据的功能
- uio的mmap的memory是通过dma_alloc_coherent来做映射的
- SQLite数据表相关操作
- Android 跨进程通信: AIDL
- stl——括号匹配
- Leetcode 233. Number of Digit One
- 使用SqlBulkCopy实现批量插入
- 被说了很多遍的设计模式---中介者模式
- 前台表格代码
- Unity3D-屏幕截图
- LeetCode 396. Rotate Function
- LeetCode Max Consecutive Ones
- java从入门到弃坑第四天
- C# 启动调试 开始执行(不调试)多线程程序执行效果不一样 Mutex(已解决)
- 软件工程从头学起(大数据方向)