本文主要是介绍Vsual Studio 2022 MiniExcel + EF+CodeFirst + Z.EntityFramework.Extensions大批量数据批量插入、更新、删除,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- MiniExcel
- Z.EntityFramework.Extensions
- 技术实现
- .app.config文件配置
- TEST实体类
- 数据库与模型连接类MiniExcelDb
- 批量插入
- 批量更新
- 批量删除
MiniExcel
简介
MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。
目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。
特点
低内存耗用,避免OOM、频繁 Full GC 情况
支持即时操作每行数据
兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询
轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB
简便操作的 API 风格。
开源地址:点击前往
Z.EntityFramework.Extensions
简介
Z.EntityFramework.Extensions,插件收费,EF结合该插件性能很给力,当然网上也有不少破解的,跟破解教程,如果是商用这里还是比较建议购买使用,如果是个人研究学习,在下也觉得还是可以搞一搞的。
获取途径
1.官方网站下载最新的dll文件。
2.VS Nuget直接搜索进行安装。
官方地址:点击前往
技术实现
本例子是基于ADO.NET + CodeFirst + Oracle进行实体建模,如果出现无法选到Oracle驱动就看我另一篇文章Visual Studio 2022 ADO.NET数据实体模型+EF+CodeFirst添加Oracle数据库驱动。还要NuGet安装框架必须支持的EntityFramework6.0、Oracle.ManagedDataAccess、Oracle.ManagedDataAccess.EntityFramework,两个Oracle的要注意版本号一致,因为不是主讲所以这里就直奔主题。
.app.config文件配置
<connectionStrings><!--添加数据库连接--><add name="MiniExcelDb" connectionString="USER ID=xxx;DATA SOURCE=ip/实例;Password=xxx" providerName="Oracle.ManagedDataAccess.Client" />
</connectionStrings>
TEST实体类
namespace MiniExcelImport.Model
{using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Data.Entity.Spatial;[Table("xxx.TEST")]public partial class TEST{[Key][Column(Order = 0)]public string ID { get; set; }[StringLength(100)]public string CODE{ get; set; }public DateTime? BEGINDATE { get; set; }public DateTime? ENDDATE { get; set; }}
}
数据库与模型连接类MiniExcelDb
using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;namespace MiniExcelImport.Model
{public partial class MiniExcelDb : DbContext{public MiniExcelDb(): base("name=MiniExcelDb"){}public virtual DbSet<TEST> TEST{ get; set; }protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Entity<TEST>().Property(e => e.CODE).IsUnicode(false);modelBuilder.Entity<TEST>().Property(e => e.ID).IsUnicode(false);}}
}
批量插入
//关闭大硬盘缓存
var config = new OpenXmlConfiguration { EnableSharedStringCache = false };
//如果Excel中的A列有空的值,则排除这些数据
var rows = MiniExcel.Query(path, configuration: config).TakeWhile(row => row.A != null);
//与数据库建立连接,业务执行完毕会自动释放
using (MiniExcelDb db = new MiniExcelDb())
{//声明表集合对象,用于存放解析到的每一条数据List<TEST> listInset = new List<TEST>();foreach (var row in rows){TEST test = new TEST(){ID = Guid.NewGuid().ToString(),CODE = row.A,BEGINDATE = row.B == null ? null : Convert.ToDateTime(row.B),ENDDATE = row.C == null ? null : Convert.ToDateTime(row.C)};listInset.Add(test);//开始执行插入操作if (listInset.Count > 0){try{db.BulkInsert(listInset);}catch (Exception ex){Console.WriteLine("批量插入失败......");}}}
}
批量更新
与插入的区别就在要找到表中要更改的数据,加到集合中,然后进行批量更新。
//获取哪些数据需要更新
List<TEST> listUpdate = new List<TEST>();
//TEST test = db.TEST.Find(v => v.ID == id);
TEST test = db.TEST.Where(v => v.ID == id).FirstOrDefault();
test.CODE = row.A,
test.BEGINDATE = row.B == null ? null : Convert.ToDateTime(row.B),
test.ENDDATE = row.C == null ? null : Convert.ToDateTime(row.C)
listUpdate.Add(test);
//判断是否有数据
if (listUpdate.Count > 0)
//批量更新
db.BulkUpdate(listUpdate);
批量删除
//获取哪些数据需要删除
List<TEST> listDel= new List<TEST>();
TEST del= new TEST { ID = id};
listDel.Add(del);
//判断是否有数据
if (listDel.Count > 0)
//批量删除
db.BulkDelete(listDel);
MiniExcel还有更深,更高级的用法。开源地址:点击前往
这篇关于Vsual Studio 2022 MiniExcel + EF+CodeFirst + Z.EntityFramework.Extensions大批量数据批量插入、更新、删除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!