当前位置:首页 > 问答 > 正文

Access数据库DLL那些事儿,权限啥的还有稳定性你得知道

说到用Access数据库(就是那个.mdb或者.accdb文件)来做程序,尤其是用VB6、VC++甚至一些现在的编程语言去连接它,就绕不开一个叫“DLL”的东西,这事儿说起来有点年头了,但直到现在还有很多老系统在用,所以搞清楚里面的门道,特别是权限和稳定性,非常有必要。

核心DLL:DAO和ADO

最早,也是和Access绑定最深的一个DLL,叫做 Microsoft DAO x.x Object Library(来源:微软开发者网络MSDN),DAO的全称是数据访问对象,可以理解为它是专门为.mdb格式的Access数据库量身定做的“司机”,你用VB6打开一个Access项目,基本上默认引用的就是它,它的代码写起来很直观,比如你打开数据库、打开一个表,感觉就像是在直接操作Access本身一样。

后来,微软想搞一个能统一访问各种数据源(比如不只是Access,还有SQL Server甚至文本文件)的东西,于是就推出了 ActiveX Data Objects (ADO)(来源:微软开发者网络MSDN),ADO比DAO更灵活,功能也更强大,它不单单是针对Access的,你现在用一些现代语言(NET)去连Access,背后大概率用的也是ADO.NET,算是ADO的升级版。

Access数据库DLL那些事儿,权限啥的还有稳定性你得知道

第一个要明白的点是:你连接Access数据库,主要就是通过调用DAO或者ADO这两个DLL来实现的,你的程序能不能顺利读到数据库里的数据,首先就得看这些DLL在电脑上有没有、版本对不对。

权限问题:不只是数据库密码那么简单

很多人觉得权限就是给数据库设个密码,没错,Access数据库本身可以设置一个密码,DAO和ADO在连接的时候,可以在连接字符串里把这个密码带上,但这只是最基础的一层。

更深层次的权限问题,其实跟Windows操作系统本身紧密相关(来源:基于经验的常见问题总结),你的Access数据库文件(.mdb)是放在电脑的某个文件夹里的,你的程序(比如一个.exe文件)在运行时,是以某个“用户身份”在运行的。

Access数据库DLL那些事儿,权限啥的还有稳定性你得知道

  • 文件操作权限:如果你的程序想要去打开、修改那个.mdb文件,那么运行你这个程序的用户,必须对.mdb文件所在的文件夹有“读取”和“写入”的权限,如果没有,比如你把数据库放在C盘根目录下,而普通用户权限是不够格在C盘根目录下创建或修改文件的(系统会阻止),那么你的程序在连接数据库时就会报错,提示找不到路径或者没有权限,这跟DLL本身无关,是Windows的安全机制,把数据库文件放在“我的文档”或者程序自己的安装目录下,通常会更稳妥,因为这些地方用户通常有完全的控制权。

  • 多用户共享访问权限:如果这个数据库是放在一台网络共享电脑上,好几个人要同时用你的程序去访问它,不仅每个运行程序的人要对那个网络共享文件夹有访问权限,还要处理一个叫“锁”文件的问题,Access在多用户访问时,会自动生成一个同名的.ldb文件(对于.accdb是.laccdb)来记录谁正在用、锁定了哪些数据,如果网络权限设置不当,可能导致这个锁文件创建失败或者无法更新,结果就是大家互相干扰,数据乱套。

稳定性:让人又爱又恨的痛点

Access数据库搭配DLL的稳定性,是出了名的需要小心伺候。

Access数据库DLL那些事儿,权限啥的还有稳定性你得知道

  1. 版本兼容性是头号杀手(来源:大量开发者社区反馈),你用ADO 2.8写的程序,拿到一个只安装了旧版ADO 2.5的电脑上,可能直接就运行不起来,会报“找不到对象”之类的错误,同样,你用一个高版本的Access(比如Office 2016创建的.accdb文件)创建的数据库,用一个只支持老.mdb格式的旧版DAO DLL去连接,那也是绝对打不开的,解决这个问题的一个笨办法就是确保目标电脑上安装了正确版本的MDAC(微软数据访问组件)或Access运行时,但这又增加了部署的麻烦。

  2. 并发处理能力弱,这是Access数据库本身的局限性,但通过DLL访问时问题会暴露无遗,当很多人同时修改同一条记录时,Access很容易出现锁冲突,导致你的程序卡死或者抛出异常,虽然DAO和ADO都提供了错误处理的机制,让你在代码里可以捕捉到“其他人正在使用”这类错误,然后重试或者提示用户,但这需要程序员有很好的预见性,主动去处理,处理不好,程序就显得非常不稳定。

  3. 数据库文件容易损坏,这也是个老生常谈的问题(来源:微软官方知识库文章),特别是在网络环境下,如果网络突然中断,或者程序因为异常崩溃,而当时正有数据在写入,就很有可能导致.mdb文件损坏,一旦损坏,轻则某些表打不开,重则整个数据库报废,但凡用Access做后台的正式程序,必须定期备份数据库,这几乎是一条铁律。

  4. DLL文件本身被破坏或冲突,电脑上安装了多个软件,每个软件都可能自带不同版本的DAO或ADO相关DLL,如果安装程序不小心用旧版本覆盖了新版本,或者反过来,就可能造成“DLL地狱”,导致所有依赖这个DLL的程序都出问题。

用DAO或ADO这些DLL来操作Access数据库,在小型、单机或对并发要求不高的场景下,是简单快捷的,但一旦涉及到部署、多用户、网络环境,你就必须对Windows文件权限、DLL版本和数据库的脆弱性有清醒的认识,这些东西不是在编程语法里能学到的,都是实践中一点点踩坑总结出来的“血泪教训”,确保权限到位、处理好异常、做好定期备份,这三板斧是保证你那套系统能稳定跑下去的关键。