博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SqlBulkCopy批量数据导入(EF实现)
阅读量:3530 次
发布时间:2019-05-20

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

      在做项目是,数据的导入是经常被客户提出的一个基础需求了,这也导致很多系统都需要使用导入功能。个人整理了做过项目,整理一份导入的代码实现方法(项目中做了封装,此文只介绍实现思路)。

    项目使用的mvc模式,数据库访问使用的EF处理数据增删改查。

  • 首先你要有一个最直接的封装有SqlBulkCopy的类,如下:    
        ///         /// 大批量数据导入到数据库中        ///         /// 数据表        /// 表名称        /// 
成功返回true,否则false
public static bool BulkCopyTable(DataTable dataTable, string tableName) { try { using (var sqlBulkCopy = new SqlBulkCopy(connectionString)) { sqlBulkCopy.DestinationTableName = tableName; if (dataTable != null && dataTable.Rows.Count != 0) { sqlBulkCopy.WriteToServer(dataTable); } sqlBulkCopy.Close(); return true; } } catch (System.Exception ex) { Console.WriteLine(ex.Message); return false; } }

  • 其次,项目中使用到了一个DataTable的扩展类,具体如下:
///     /// DataTable扩展类    ///     public static class DataTableExtensions    {        ///         /// Convert a List{T} to a DataTable.        ///         public static DataTable ToDataTable
(List
items) { var tb = new DataTable(typeof(T).Name); PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in props) { Type t = GetCoreType(prop.PropertyType); tb.Columns.Add(prop.Name, t); } foreach (T item in items) { var values = new object[props.Length]; for (int i = 0; i < props.Length; i++) { values[i] = props[i].GetValue(item, null); } tb.Rows.Add(values); } return tb; } ///
/// Return underlying type if type is Nullable otherwise return the type /// public static Type GetCoreType(Type t) { if (t != null && IsNullable(t)) { if (!t.IsValueType) { return t; } return Nullable.GetUnderlyingType(t); } return t; } ///
/// Determine of specified type is nullable /// public static bool IsNullable(Type t) { return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)); } }

:这个类主要是将导入的数据集合转换为datatable以方便作为批量插入方法的参数。

  • 具体的导入代码如下:
var data = ExcelOpr.ImportExcel(path);   var lstA = new List();   for (int rowIndex = 1; rowIndex < data.GetLength(0); rowIndex++)   {        var a = new A();	//处理具体的字段赋值	lstA.Add(a);   }   //导入到数据库中   if (lstA != null && lstA.Count > 0)   {       var dt = DataTableExtensions.ToDataTable(lstA);       tempService.ImportExecel(dt);   }

注:1、此处A为具体需要导入的数据表在EF中对应的c#类名,请一定保证EF中对象字段的顺序和数据库中的列顺序一致,否则无法导入;

    2、第一句代码

ExcelOpr.ImportExcel(path);

    path为导入文件的绝对路径,使用的是封装的导入方法,代码如下:(需要使用Aspose.Cells,在vs中自行下载、添加)

///         /// 导入excel;返回是object的数组类型数据;        /// 其中data.GetLength(0)表示数据的条数,包括标题栏;        /// data.GetLength(1)表示数据的列数;        /// data.GetValue(1, 1)表示拿到对应下表的数据;        /// 使用形如:for (int i = 1; i 小于 data.GetLength(0); i++){}方式生成具体类型即可!        ///         /// 文件名(包含路径)        /// 
Object[,]数组类型
public static Object[,] ImportExcel(String strFileName) { Workbook book = new Workbook(strFileName); //book.Open(strFileName); Worksheet sheet = book.Worksheets[0]; Cells cells = sheet.Cells; return cells.ExportArray(0, 0, cells.MaxDataRow + 1, cells.MaxDataColumn + 1); }
    3、
最后一句
tempService.ImportExecel(dt);
tempService 为业务逻辑实现的对象,调用具体的导入方法:
///         /// excel数据导入,批量导入        ///         /// datatable        /// 
public bool ImportExecel(System.Data.DataTable dt) { return SqlHelper.BulkCopyTable(dt, "数据库表名"); }
零零散散记录下来,即算是一个知识的整理学习,也方便以后查询使用!!

转载地址:http://xrwhj.baihongyu.com/

你可能感兴趣的文章
[LeetCode javaScript] 1. 两数之和
查看>>
[LeetCode javaScript] 14. 最长公共前缀
查看>>
[LeetCode javaScript] 26. 删除排序数组中的重复项
查看>>
[LeetCode javaScript] 8. 字符串转换整数 (atoi)
查看>>
[LeetCode javaScript] 28. 实现strStr()
查看>>
cv2.error: OpenCV(3.4.2) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:25
查看>>
前端网页学习7(css背景属性)
查看>>
前端网页学习8(css三大特性:层叠性,继承性,优先级)
查看>>
前端网页学习9(css盒子)
查看>>
python学习8(列表)
查看>>
JavaScript学习(new1)
查看>>
http GET 和 POST 请求的优缺点、区别以及误区
查看>>
JVM的4种垃圾回收算法、垃圾回收机制
查看>>
什么是分布式事务
查看>>
常用的分布式事务解决方案
查看>>
设计模式:单例模式 (关于饿汉式和懒汉式)
查看>>
一致性Hash算法
查看>>
更新Navicat Premium 后打开数据库出现1146 - Table 'performance_schema.session_variables' doesn't exist
查看>>
安装rabbitmq时踩的坑
查看>>
2021-06-09数据库添加多条数据
查看>>