ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

离线老机器MDAC 2.8安装修复与ADO连接排错指南

离线老机器MDAC 2.8安装修复与ADO连接排错指南 简介这份MDAC 2.8完整安装包面向仍在Windows XP环境中使用Access、ADO或OLE DB的开发者与运维人员用于应对“没有注册类别”“未找到提供程序”等数据库访问组件异常提供一套可直接用于组件重装的完整文件集合。压缩包共82个文件约4.29MB以dll动态链接库为主体并包含rll本地化资源、inc包含文件、tlb类型库、reg注册表脚本及inf安装信息等覆盖ado、msadc与OLE DB相关模块。资源将系统目录中的组件文件集中整理配有安装入口、所需文件目录和说明文档便于在XP下完成组件修复并排查缺失问题Vista与Win7环境不适用。目前已有2675人学习下载适合需要恢复旧系统数据库连通性、补齐MDAC组件的用户参考。1. 接手一台离线老机器卡在“没有注册类别”上去年帮一个做设备配套的团队处理过一台离线工控机。程序是十多年前写的界面用的是 ADO 连接 Access 数据库。在现场运行得好好的搬到另一台同型号机器上程序一启动就弹出对话框“没有注册类别”。换了一台机器再试报错却变成了“未找到提供程序”。代码一行都没有改动机器型号也相同只是换了一个环境程序就无法正常运行了。最后还是靠一个完整的 MDAC 2.8 安装包才把数据访问组件补齐。MDAC 2.8 就是微软数据库访问组件Microsoft Data Access Components的最后一个独立发行版。它把 ADO、OLE DB、ODBC、Jet 引擎、RDS 这些老组件打包在一起是 Windows 98 到 Windows Server 2003 时期几乎所有数据库程序的运行前提。它现在已经算是老组件但还没有彻底消失老 ERP、老工控软件、学校实验室里跑的采集程序很多仍然依赖它。装不好的后果很直接程序无法启动连接对话框显示“没有注册类别”或者一直卡在“未找到提供程序”上现场人员只能靠重装系统来碰运气。这篇记录写给两类人手里正好有这台老机器、必须让它跑起来的人以及想搞清楚 MDAC 2.8 到底该怎么装、装坏以后怎么恢复的人。2. 先说清环境版本、位数与系统自带组件MDAC 2.8 最容易出问题的地方不是安装过程本身而是安装之前没有弄清楚机器上“已经有什么”。它有两个常见版本号RTM 版是 2.80.1022.3SP1 版是 2.81.1117.0。很多人口中的“MDAC 2.8 安装不上”实际上是因为系统里组件版本比安装包还高安装程序判断为降级后自己退出了。所以在双击安装包之前先把下面三件事确认一遍。2.1 用一条注册表命令确认现有版本不要靠“控制面板里有没有 MDAC”来判断因为它从来不会出现在那里。真正的版本记录在注册表里查询一次就能看到:: 32 位系统直接查64 位系统两个视图都要查 reg query HKLM\SOFTWARE\Microsoft\DataAccess /v FullInstallVer reg query HKLM\SOFTWARE\WOW6432Node\Microsoft\DataAccess /v FullInstallVer :: 如果上面报“系统找不到指定的注册表项或值”说明组件缺失或被卸载过FullInstallVer是完整版本号Version是主版本号两个值一般同时存在。输出2.81.1117.0说明系统里已经是 MDAC 2.8 SP1输出2.80.1022.3是 RTM输出2.50.4403.0这种说明还停在 MDAC 2.5属于该升级的情况如果直接报“找不到”那这台机器上基本可以确定组件已经损坏或者被人为删过。在 64 位系统上千万别只查一处。32 位程序读的是WOW6432Node下面的那份64 位程序读的是另一份两边版本不一致是老机器上很常见的一种状态也是“同一个程序在 A 机器能跑、B 机器报错”的根本原因之一。2.2 位数对不上装十遍也白装MDAC 2.8 从发布到退场只出过 x86 版本没有 64 位安装包。这一点必须先讲清楚否则后面全是无用功。在 64 位 Windows 上64 位的数据访问组件是系统自带的后来的版本叫 WDACMDAC 2.8 安装包根本管不到那一层安装包能影响的只有SysWOW64下的 32 位那一套。更麻烦的是很多 MDAC 2.8 安装程序在 64 位系统上会直接弹出“该平台不受支持”然后退出这不是包坏了是它本来就不支持。判断方法很简单检查项命令或位置结论系统位数echo %PROCESSOR_ARCHITECTURE%x86才考虑装 MDAC 2.8程序位数任务管理器看进程是否带*32带*32说明是 32 位进程组件位数%windir%\System32与%windir%\SysWOW64两套目录对应两套组件我通常的处理方式是64 位系统上不再安装 MDAC 2.8直接确认SysWOW64下的 32 位组件是否完整缺什么补什么确实需要 64 位进程访问 Access就换成别的方案不要在 MDAC 上继续尝试。硬装上去了也只会让 32 位那一半“半新半旧”后面报错更难查。2.3 系统与内置组件对照哪些机器根本不该装下面这张表是我自己整理的环境对照每次接手老机器先对一眼能省掉大量试错操作系统自带数据访问组件能否装 MDAC 2.8建议做法Windows 98 / MEMDAC 2.1 ~ 2.5可以直接装 2.8 SP1Windows NT 4.0MDAC 2.1 左右可以需先打 SP装 2.8 SP1Windows 2000MDAC 2.5 SP3 / 2.7可以装 2.8 SP1Windows XP 原版MDAC 2.7可以装 2.8 SP1Windows XP SP2 / SP32.81.1117.0会被拒绝不用装走修复Windows Server 20032.8 或 2.8 SP1视具体版本优先用系统自带Windows Vista 及以后WDAC 6.x / 10.x不支持不要装改用其他提供程序XP SP2 那一行要特别说明系统自带的已经是 2.8 SP1安装包再装一遍只会提示“已安装更高版本”。这时候真正该做的是修复而不是重装。修复和重装的操作在下一章会分开讲两者差别很大。3. 安装 MDAC 2.8解包、静默安装与回滚点确认完环境才轮到动手。这套组件的安装程序是一个自解压包双击会走图形界面一路下一步但在无人值守或者远程协助的场景里图形界面反而是负担而且中途弹出的重启提示经常被人点掉导致装了一半。我的习惯是先解包看清楚再用命令行跑。3.1 解包先看清 mdac_typ.exe 里装了什么自解压包支持把内容释放到指定目录先释放再安装出问题时容易定位:: 释放到临时目录/c 表示执行包内命令/t 指定目标路径 mdac_typ.exe /c /t:C:\temp\mdac28 :: 释放完成后进目录看一眼真正的安装器在里面 dir C:\temp\mdac28释放出来的目录里能看到setup.exe、dasetup.exe以及一堆.inf、.dll。setup.exe是外壳真正读写注册表、替换系统文件的是dasetup.exe。这个细节有用图形界面报错一闪而过时直接跑dasetup.exe错误码会留在控制台里不会丢。如果手头这台机器不允许在 C 盘写东西把/t指到别的分区就行解包本身不写系统目录属于纯释放删掉目录也不留痕迹。3.2 静默安装与修复安装的命令行参数安装和修复是两套参数不要混用:: 标准静默安装/q 无界面/c 传给内层 setup.exe/qn 内层也完全静默 mdac_typ.exe /q /c:setup.exe /qn :: 已经装过但组件损坏用修复模式重新注册并替换文件 C:\temp\mdac28\dasetup.exe /q /f :: 只检查不修改用来确认包和当前系统的匹配情况 C:\temp\mdac28\dasetup.exe /q /c/q和/qn的区别在于层级外面一层是自解压器里面一层才是安装引擎两层都要给静默参数否则还是会弹窗。/f是修复开关它的作用是把包里的文件按版本比较规则重新写一遍并重注册比手工regsvr32靠谱得多/c只做检查我一般在正式动手前先跑一次确认包认为这台机器缺什么。参数给对了还要看一个东西安装日志。安装器的日志默认落在系统目录下常见文件名是dasup.log。装完别急着开程序先看日志尾部有没有Return value 3。这个值基本等价于“某一步失败了已经回滚”后面的行会写明是哪个组件、哪个文件出的问题。提示静默安装期间不要去点“添加删除程序”或者同时开别的安装包。MDAC 会替换系统目录里的共享 DLL两个安装器同时写同一批文件结果就是两个都没装好。3.3 装前留后悔药还原点、注册表导出与文件备份这套组件最让人难受的地方是它替换的是系统共享文件装坏了不会自动恢复。所以我现在一律先做三件事做完才允许自己敲安装命令。第一建系统还原点。命令行一条就够不用去图形界面点:: 创建一个名为 before-mdac28 的还原点 wmic.exe /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint before-mdac28, 100, 7CreateRestorePoint的两个数字参数分别是还原点类型和事件类型照抄即可。这条命令在部分精简版系统上会失败失败就别勉强走第二步。第二导出注册表相关键。数据访问组件的注册信息集中在HKLM\SOFTWARE\Microsoft\DataAccess和HKLM\SOFTWARE\Classes\CLSID下面后者太大不适合全导实际做法是只导 DataAccess 加一份当前已注册提供程序清单出问题时用来对比reg export HKLM\SOFTWARE\Microsoft\DataAccess C:\backup\dataaccess.reg /y reg export HKLM\SOFTWARE\WOW6432Node\Microsoft\DataAccess C:\backup\dataaccess32.reg /y第三把%windir%\System32下几个关键文件复制一份到备份目录包括msado15.dll、oledb32.dll、msdaps.dll、msdasql.dll、sqloledb.dll、msjet40.dll。真到了要回退的时候直接覆盖回去再重注册比满世界找同版本文件快得多。4. 配置与注册让 ADO 和 OLE DB 指回正确的 DLL安装完成不等于可以使用。MDAC 这类组件的“装好”包含两层含义文件在正确的目录里以及注册表里的 CLSID 指向这些文件。前者由安装包负责后者经常被别的安装程序破坏。这一章讲的就是第二层。4.1 DataAccess 键值判断装没装上的第一现场装完先回到第 2 章那条命令再查一次reg query HKLM\SOFTWARE\Microsoft\DataAccess /v FullInstallVer reg query HKLM\SOFTWARE\Microsoft\DataAccess /v Version装的是 SP1这里应该出现2.81.1117.0。如果还是老版本号说明安装被判定为降级、自动跳过了日志里会有对应记录如果键整个不存在说明安装中途回滚了得回去看dasup.log。除了版本号还有一处值得看HKLM\SOFTWARE\Microsoft\DataAccess下面的Installed Version和组件子键。有些精简版系统会把子键删掉版本号还在但组件枚举不出来表现就是程序能找到 ADO、找不到具体的 OLE DB 提供程序。4.2 ADO 与 OLE DB 的重新注册regsvr32 能救什么、救不了什么“没有注册类别”这个报错八成是 COM 注册信息丢了。补注册的标准工具是regsvr32:: ADO 主库路径在 Common Files 下注意引号 regsvr32 /s %CommonProgramFiles%\System\ado\msado15.dll regsvr32 /s %CommonProgramFiles(x86)%\System\ado\msado15.dll :: OLE DB 核心与常见提供程序 regsvr32 /s %windir%\System32\oledb32.dll regsvr32 /s %windir%\System32\msdaps.dll regsvr32 /s %windir%\System32\msdasql.dll regsvr32 /s %windir%\System32\sqloledb.dll regsvr32 /s %windir%\System32\msdaora.dll/s是静默不弹成功对话框去掉它可以看到每次注册的返回码排查时有用。每条命令背后做的事是调用该 DLL 的DllRegisterServer把里面写死的 CLSID 和 ProgID 写进注册表。所以只有实现了这个导出函数的 DLL 才能这么修。这里必须说清楚一个边界msjet40.dll这类 Jet 引擎文件不支持regsvr32硬跑只会得到“找不到入口点”。Jet 的注册信息是安装时由 INF 文件写进去的修它只能靠dasetup.exe /f重新走一遍安装流程。另一个常见失败是返回0x80070005那是权限不够用管理员身份重开命令行返回0x80004005一般是依赖的 DLL 缺失这时候regsvr32救不了得回去补装。注意手工regsvr32永远只是应急手段。它只补注册表不补文件版本。如果 DLL 本身被旧版本覆盖了注册成功也照样报错而且会掩盖真正的问题。修完一次不生效就别再重复敲了直接走修复安装。4.3 连接字符串里的 Provider 怎么写才不踩位数的坑组件都在位程序还是连不上问题经常出在连接字符串。老代码里最常见的写法是ProviderMicrosoft.Jet.OLEDB.4.0这个提供程序只有 32 位版本64 位进程加载它必然失败报的就是“未找到提供程序”。 32 位进程访问 Access最稳的写法 conn.Open ProviderMicrosoft.Jet.OLEDB.4.0;Data SourceC:\data\demo.mdb;Persist Security InfoFalse 走 ODBC 桥接适用于已有系统 DSN 的场景 conn.Open ProviderMSDASQL;DSNlegacy_access;UID;PWD; 连 SQL Server老环境优先用 SQLOLEDB不要硬上后来的 Native Client conn.Open ProviderSQLOLEDB;Data Source192.168.1.10;Initial Catalogdemo;User IDsa;Password***;Persist Security InfoFalse的意思是连接打开后不把密码留在连接对象里对老程序兼容性更好也少一个安全隐患。MSDASQL是 OLE DB 到 ODBC 的桥它的 64 位版本在部分系统上并不完整所以 64 位进程用它会报“未找到提供程序”这不是配置错是根本没有这个组件。5. 排错避坑几个反复出现的报错这套组件装多了会发现报错就那几种但每次的原因未必相同。下面五条是按我实际遇到频率排的每条都按“现象 → 原因 → 解决”记照着对号入座基本能命中。5.1 没有注册类别0x80040154现象程序启动或第一次建连接时抛异常错误码0x80040154中文提示“没有注册类别”。原因msado15.dll或某个 OLE DB 核心 DLL 的 CLSID 在注册表里找不到。常见诱因是别的安装包在卸载时把Common Files\System\ado目录清掉了或者有人手工删过注册表。解决先确认文件在不在不在就从备份或安装包补回去在的话跑 4.2 的regsvr32。补完立刻用 4.1 的命令确认版本号没变变了说明有别的程序在抢着写。5.2 未找到提供程序但程序名字写得没错现象连接字符串里的Provider明明和老机器上一模一样到了新机器就报“未找到提供程序。该程序可能未正确安装。”原因九成是位数问题。32 位进程去 64 位注册表视图里找提供程序找不到或者反过来64 位进程去用只有 32 位版本的 Jet。解决先确认进程位数再确认提供程序位数。可以用 PowerShell 枚举当前进程能看到的提供程序# 列出当前进程可见的 OLE DB 提供程序 $enum [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator() $table New-Object System.Data.DataTable $table.Load($enum) $table | Format-Table SOURCES_NAME, SOURCES_DESCRIPTION -AutoSize在 32 位 PowerShell 和 64 位 PowerShell 里各跑一次两次输出不一样是正常的。列表里没有Microsoft.Jet.OLEDB.4.0就别再纠连接字符串了那是组件层的问题。5.3 安装跑到一半回滚日志里是 Return value 3现象静默安装执行完命令返回成功但组件版本没变系统目录里的文件时间戳也没更新。原因安装器检测到版本降级或者文件被占用主动回滚了。常见于 XP SP2 以后的系统或者杀毒软件正锁着msjet40.dll。解决看dasup.log尾部找到标了Return value 3的那一段前面几行会写清是哪个组件失败。确认是版本问题的改用dasetup.exe /q /f走修复确认是文件占用的先停掉杀毒软件的实时防护再装装完开回来。5.4 装完能用重启又坏现象装好后程序正常第二天开机又报同样的错。原因机器上有别的软件在启动时做“组件自检”把共享 DLL 换成了它自带的旧版本。这种情况在老机器上尤其多装了两套不同年代的业务系统时几乎必然发生。解决装完先跑一次修复安装然后查文件版本是否被改回旧版。长期方案是把这个程序的依赖固定下来别让其他安装包有机会覆盖实在协调不了就只能在使用前跑一遍修复脚本把dasetup.exe /q /f加进批处理里。5.5 权限问题Jet 引擎建不了锁文件现象单机测试正常部署到服务器或者共享目录上一写数据就报错报错内容和“未找到提供程序”很像容易误判。原因Jet 打开数据库时会在同目录下建一个.ldb锁文件。运行账户对目录没有写权限或者目录在只读共享上就会失败。解决给应用程序池账户或服务账户对该目录的修改权限别图省事给 Everyone。共享目录的话确认共享权限和 NTFS 权限两层都放开了。6. 装完怎么验证三条命令跑通再交付装完不验证就交付是我早年踩过最大的坑。后来我固定成一套流程先看版本、再看提供程序、最后做一次真实连接三步都过才算完成。下面这套是我现在每次装 MDAC 2.8 都会跑的。第一步版本核对reg query HKLM\SOFTWARE\Microsoft\DataAccess /v FullInstallVer reg query HKLM\SOFTWARE\WOW6432Node\Microsoft\DataAccess /v FullInstallVer两个视图都要出结果且版本号为2.81.1117.0。只出一个或者版本号不一致都说明这次安装只成功了一半。第二步提供程序枚举用 5.2 那段 PowerShell在目标进程对应位数的宿主里跑一遍确认Microsoft.Jet.OLEDB.4.0、MSDASQL、SQLOLEDB都在列表里。第三步做一次真实连接。不要用“能不能打开程序”当标准程序打开但没连库的情况太常见了。我一般用一个几十行的 VBS 脚本在目标机器上建个临时 Access 文件写入一行再读出来 文件名check_mdac.vbs双击用 cscript 跑 Dim conn, rs Set conn CreateObject(ADODB.Connection) conn.Open ProviderMicrosoft.Jet.OLEDB.4.0;Data SourceC:\mdac_check\demo.mdb; Set rs conn.Execute(SELECT 1 AS ok) WScript.Echo ADO 版本: conn.Version WScript.Echo 读取结果: rs.Fields(ok).Value rs.Close : conn.Closeconn.Version输出2.8说明 ADO 库加载正确读取结果: 1说明 Jet 引擎和锁文件都正常。两行都出来才算这次安装真正跑通。验证项对照如下验证项通过标准不通过的典型原因注册表版本号2.81.1117.032/64 视图都在安装回滚、版本降级提供程序枚举Jet、MSDASQL、SQLOLEDB 齐全位数不匹配、组件缺失ADO 连接测试Version 输出 2.8能读到数据权限、锁文件、路径错误日志无Return value 3文件占用、杀软拦截还有一个小技巧验证脚本要放在最终运行账户下跑而不是用管理员账户跑完就完事。管理员能过、服务账户过不了的情况太常见了尤其是 5.5 那条权限问题只有换到真实账户才会暴露。从那以后我每次装完这套组件都强制走一遍“版本号 → 提供程序 → 真实连接”这三步一个都不跳哪怕已经装过几十次。因为它的故障模式太隐蔽了装完看着好好的一周以后才在客户现场爆出来那时候再回头查注册表线索早就被别的安装包抹掉了。这份安装包我一般会留一份在离线介质里机器不联网的时候它比任何在线方案都靠谱。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表