C#.NET ORM 如何访问 Access 数据库 [FreeSql]

最近很多 .net QQ 群无故被封停 , 特别是 wpf 群几乎全军覆没 。依乐祝的 .net6交流群,晓晨的 .net跨平台交流群 , 导致很多码友流离失所无家可归,借此机会使用一次召唤术 , 有需要的请加群:560611514【.NET C#爱好者】,6406277【C#/.Net Core社区】,822074314【DotNet开发交流群】
前言看到标题点进来 , 也许有人问,为什么不用 mysql , 为什么不用 sqlite,为什么不这样那样 。
其实有时候情非得已,被迫使用不由得自己选择,没有谁天天做新项目,新项目当然不会选 Access 数据库,复杂的业务群体对方发送过来的文件是 Access 也没得选 , 难道可以要求对方公司换数据库?
Microsoft Office Access是由微软发布的关系数据库管理系统 。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一 。
Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统 。它是微软OFFICE的一个成员, 在包括专业版和更高版本的office版本里面被单独出售 。2018年9月25日,最新的微软Office Access 2019在微软Office 2019里发布 。
MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里 。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库) 。
C#.NET 访问 Access 数据库从 .NETframework 1.0 到现今的 dotnet-7.0,访问 Access 数据库都只能用 oledb 方式,微软历史访问数据库的方式有许多种(ado、odbc、oledb、ado.net),oledb 是其中的一种 。
连接字符串常见的有两种:

  • Provider=Microsoft.Jet.OleDb.4.0;Data Source=d:/accdb/2003.mdb
  • Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:/accdb/2007.accdb
Access 支持 SQL 语句,使用起来和普通关系型数据库差不多,由于不想在代码中写 SQL,为了让 crud 操作起来更加便利,决定引入 C#.NET ORM Freesql,因为他支持 .NETFramework 4.0 及以后的所有 dotnet 版本 , 适应范围更广 。
FreeSql 介绍.NET ORM Object Relational Mapping 是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 。
FreeSql .NET ORM 支持 .NetFramework4.0+、.NetCore、Xamarin、MAUI、Blazor、以及还有说不出来的运行平台,因为代码绿色无依赖,支持新平台非常简单 。目前单元测试数量:8500+,Nuget下载数量:1M+ 。使用最宽松的开源协议 MIT https://github.com/dotnetcore/FreeSql,可以商用,文档齐全,甚至拿去卖钱也可以 。
FreeSql 主要优势在于易用性上,基本是开箱即用,在不同数据库之间切换兼容性比较好 , 整体的功能特性如下:
  • 支持 CodeFirst 对比结构变化迁移、DbFirst 从数据库生成实体类;
  • 支持 丰富的表达式函数,独特的自定义解析;
  • 支持 批量添加、批量更新、BulkCopy、导航属性 , 贪婪加载、延时加载、级联保存、级联删除;
  • 支持 读写分离、分表分库,租户设计,分布式事务;
  • 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/神通/人大金仓/翰高/Clickhouse/MsAccess Ado.net 实现包 , 以及 Odbc 的专门实现包;
8000+个单元测试作为基调,支持10多数数据库,我们提供了通用Odbc理论上支持所有数据库,目前已知有群友使用 FreeSql 操作华为高斯、mycat、tidb 等数据库 。安装时只需要选择对应的数据库实现包:
dotnet add packages FreeSql.Provider.MsAccess
public class DB{static Lazy<IFreeSql> accessLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MsAccess, "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:/accdb/2007.accdb")//.UseAutoSyncStructure(true) 自动建表,适合新项目.UseNoneCommandParameter(true).UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)).Build());public static IFreeSql access => accessLazy.Value;}定义 DB.cs 类之后就可以快乐的 CRUD 了 。FreeSql 提供多种 CRUD 使用习惯,请根据实际情况选择团队合适的一种:
  • 要么 FreeSql,原始用法;
  • 要么 FreeSql.Repository,仓储 + 工作单元习惯;
  • 要么 FreeSql.DbContext,很像 EFCore 的使用习惯,兼容 EFCore 99% 的实体注解;
  • 要么 FreeSql.BaseEntity,充血模式;
  • 要么 直接像 dapper 那样使用 SqlConnection 扩展方法;
CRUD 模式一:原始用法 APIDB.access.Select<T>(); //查询DB.access.Insert<T>(); //插入DB.access.Update<T>(); //更新DB.access.Delete<T>(); //删除DB.access.InsertOrUpdate<T>()// 插入或更新DB.access.Transaction(..); //事务DB.access.CodeFirst; //CodeFirst 对象DB.access.DbFirst; //DbFirst 对象DB.access.Ado; //Ado 对象DB.access.Aop; //Aop 对象DB.access.GlobalFilter; //全局过滤器对象var blogs = DB.access.Select<Blog>().Where(b => b.Rating > 3).OrderBy(b => b.Url).Page(2, 10).ToList();var blog = new Blog { Url = "http://sample.com" };blog.BlogId = (int)DB.access.Insert(blog).ExecuteIdentity();DB.access.Update<Blog>().Set(b => b.Url, "http://sample2222.com").Where(b => b.Url == "http://sample.com").ExecuteAffrows();DB.access.Delete<Blog>().Where(b => b.Url == "http://sample.com").ExecuteAffrows();// 等等等 。。级联保存、级联查询、导航属性 。。。

推荐阅读