未在本地计算机上注册“microsoft.ACE.oledb.12.0”终极解决!

未在本地计算机上注册“microsoft.ACE.oledb.12.0”终极解决!

一、解决过程

这个问题搞了一天,先看代码。

       public static void loadExcel(string pathName)
        {
            string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={pathName};Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();
                System.Data.DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                foreach (DataRow row in dt.Rows)
                {
                }
            }

        }

运行就抛出异常未在本地计算机上注册“*Microsoft.ACE.OLEDB.12.0*”提供程序. 开始以为这东西应该很简单,百度了一下,发现别人都说要安装AccessDatabaseEngine这个引擎。但是链接基本上是指向微软件的,而微软官方对于12.0引擎早就不给下载。在自己电脑上搜了一下,发现还真有一个AccessDatabaseEngine.exe。从属性中看到版本号为==12.0.4518.1014==,心中暗喜,这个问题应该很快就能解决了吧。

安装完软件后,再测试,还是一样的报错。由于我的电脑是office2016,而本机上搜索到的AccessDatabaseEngine安装文件是用友U8(2011年左右的产品)里附带的。想了下,应该是跟office版本不兼容,于是又到官网搜索,真幸运,找到了16版的引擎,而且还提供了32位和64位版本下载。我这是32位的office,应该用32位吧。下载完迫不及待的安装,可惜竟然不给我安装,报错内容很长,大概是说我已经安装了32位office软件。

image-20240912172820206

搞笑的是我再安装AccessDatabaseEngineX64版本,躲猫猫呢(图中版本与实际不同,但意思一样的)!

image-20240912173130156

既然这台机装不了,那我换台没装office的电脑来测试应该可以吧。在新电脑64位系统上安装完office2007后,又安装了古董用友里面的AccessDatabaseEngine。再次测试,还是一样报错,始终识别不到我已安装的引擎。但在控制面板里是有的。是不是我这古董的AccessDatabaseEngine太旧了呢?微软官网下载不到原版,只好搜索下载,找来找去只找到2010版的,版本号为:14.0.6119.5000. 那应该连接串也要改为Microsoft.ACE.OLEDB.14.0吧(==这里就埋了一个坑,后面会提到==)!

安装完后,代码里连接串把12.0改为14.0,再次测试,仍然未注册xxx,中不过这回报的是找不到14.0,改回12.0,一样报错!见鬼了,看别人写的文章,安装引擎,几行代码就跑起来,到我这怎么这么费劲呢?

反复折腾和排查了很久,都没找到问题所在,很不甘心。于是又不断地偿试,32位装上没生效,干脆直接安装14.0的64位版本,不过提示跟上面的一样,后来在命令行里用AccessDatabaseEngine.exe /passive 忽略版本检测直接安装,竟然安装上了。继续遇到问题,因为看到安装的版本是14.0,我把连接串Provider=Microsoft.ACE.OLEDB.12.0;,改成了14.0,又是一顿操作猛于虎,回看报错在跳舞,显然这时仍然失败了。

经过N次偿试,误打误撞,把连接串改回12.0,测试成功!:cry: :cry: :cry:

二、踩坑总结

  1. 微软的这个引擎版本号写得让人迷醉,显示14.0,实际要用12.0
  2. 系统版本是64位,必须用64位的引擎
  3. 安装不了时,要用命令行运行,并在后面加/passive。 ==微软的安装检测,真是检了个寂寞,简直误导人了!==

评论已关闭