MS Access 在C#中使用DAO的踩坑记录

MS Access 在C#中使用DAO的踩坑记录

DAO是微软为访问Access数据设计的特殊接口。从Access2.0出现,DAO一直是作为默认的接口存在。ADO是作为DAO的一种替代方案一直存在。DAO和ADO可以在一个项目中同时使用。历史上,微软曾经在2003推荐使用ADO,但是后来2007后,又将DAO作为默认接口。

在Access2007之前,文件形式一直是mdb,数据库引擎最高为JET4.0,DAO接口最高版本为DAO3.6。DAO是Windows系统中自带的库,所以在C#开发中甚至不需要安装JET引擎和DAO的库。这里需要注意,JET引擎只有32位版本,未来也不会出64位版本,所以程序编译需要选择x86平台,否则会报错。另一个小技巧需要注意,Access2.0和1995虽然使用mdb文件形式,但是在最新版的Access中是打不开的。如果是手动的转换文件形式,可以用2003-2007版的Access打开95版的后保存后,再用最新版2019打开,可以实现转换为accdb。如果想用代码实现mdb到accdb文件的转换可以参考这个库中的603号函数,具体使用方法未做研究。Microsoft.Office.Interop.Access;
accessApp.SysCmd((Access.AcSysCmdAction)603, sourceFile, desFile);

在2007版之后,文件形式更改为accdb,JET引擎和DAO3.6都被微软弃用,取而代之的是ACE
引擎和ACEDAO。如果在VC++中使用CDAODATABSE或者CDAOTABDEF或者CDAORECORDESET这种库,会发现MSDN上标记了obsolete。但这不意味着,DAO3.6不能在使用,而是不再支持ACE引擎中更新的功能。老的程序使用DAO3.6,不用担心在未来运行不了,DAO是可分发的,即使未来Windows删掉自带的库,将dll加入项目引用即可。
ACEDAO和老的DAO的使用类似,在MSDN上的文档上是以DAO作为介绍的,其实是指ACEDAO,不要造成困惑。MSDN上的DAO文档使用VB作为样例,但实际上VB和C#使用的是同一个库,Microsoft.Office.Interop.Access.Dao,也就是说在C#程序也可以参照着使用DAO.
需要注意,为了使用ACE这个新的引擎,用户端必须要安装 Microsoft Access Database Engine 2010/2016 Redistributable,大概25Mo,有32位和64位版。如果是x86的程序,需要选择32位版。同样的,如果想用ODBC或OLEDB或ADO访问新文件也是要安装引擎的。

关于DAO、ODBC、OLEDB、ADO的关系可以参考这张图片。在这里插入图片描述


版权声明:本文为mercurochrome原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。