zoukankan      html  css  js  c++  java
  • 【.net】未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法

    【.net】未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法

     

    正文

    #错误描述:

      在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错:

      “未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”



    #代码示例:

    复制代码
     1      static void Main(string[] args)
     2         {
     3             readexcel("D:\test\xlsxtest.xlsx");
     4         }
     5         public static void readexcel(string _path)
     6         {
     7             DataTable dt = new DataTable();
     8             string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + _path + ";" + "Extended Properties="Excel 12.0;HDR=No"";
     9 
    10             using (OleDbConnection connection = new OleDbConnection(connectionString))
    11             {
    12                 string SQL = "select * from [sheet1$]";
    13                 try
    14                 {
    15                     OleDbCommand comm = new OleDbCommand(SQL, connection);
    16                     if (connection.State != ConnectionState.Open)
    17                         connection.Open();
    18                     OleDbDataAdapter Adpter = new OleDbDataAdapter(comm);
    19                     Adpter.Fill(dt);
    20                 }
    21                 catch (Exception ex)
    22                 {
    23                     dt = null;
    24                 }
    25                 finally
    26                 {
    27                     if (connection.State == ConnectionState.Open)
    28                         connection.Close();
    29                 }
    30 
    31                 foreach (DataRow item in dt.Rows)
    32                 {
    33                     string sds = item[0].ToString();
    34                     Console.WriteLine(item[0].ToString() + "//" + item[1].ToString() + "//" + item[2].ToString());
    35                     if (item[1].ToString() == string.Empty)
    36                     {
    37                         break;
    38                     }
    39                 }
    40                 Console.ReadKey();
    41             }
    42         }
    复制代码

     

    #报错原因:

      主要有以下几种原因:

      1、没有安装数据访问组件,需要安装相应版本的数据访问组件(AccessDatabaseEngine);

      2、没有安装相应版本的Office客户端,需要安装相应版本的Office客户端;

      3、没有在IIS应用程序池配置默认属性,需要在相应的IIS应用程序池启用32位应用程序;

      4、连接字符串的问题。采用Microsoft.Jet.OleDb.4.0,可以读取excel2007以前的版本,在客户机上不需要部署office,采用Microsoft.Ace.OleDb.12.0的时候,需要安装引擎。

      5、顺便说一下,在使用“Microsoft.Jet.OLEDB.4.0”,也会报类似错误,原因有可能是,Microsoft.Jet.OLEDB.4.0在64位系统上不支持,需要修改架构,从x64改为x86,无论是WinForm还是ASP.NET;或者修改连接字符串为Microsoft.ACE.OLEDB.12.0并且安装AccessDatabaseEngine x64数据访问组件;

    #解决方案:

      1、安装数据访问组件:

      1)适用于office2007的

      Microsoft Access Database Engine 2007 Office system 驱动程序:数据连接组件
      https://www.microsoft.com/zh-cn/download/details.aspx?id=23734    (该链接已失效,直接用Microsoft Access Database Engine 2010 Redistributable就好了

      2)适用于office2010的

      Microsoft Access Database Engine 2010 Redistributable
      https://www.microsoft.com/zh-CN/download/details.aspx?id=13255
     
      此下载将安装一组组件,非 Microsoft Office 应用程序可以使用它们从 2007/2010 Office system 文件中读取数据,例如从 Microsoft Office Access 2007/2010(mdb 和 accdb)文件以及 Microsoft Office Excel 2007/2010(xls、xlsx 和 xlsb)文件中读取数据。这些组件还支持与 Microsoft Windows SharePoint Services 和文本文件建立连接。
      此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。

      2、在IIS应用程序池中,设置“”启用兼容32位应用程序”,此设置适用于web项目;

      如图:

      
     
     
    注意:
    在下载Microsoft Access Database Engine 2010 Redistributable时会让选择下载x86的还是x64的,如图:
     
    前提是看服务器是x64的还是x86的,x64的服务器两个版本都能安装;

      如果下载安装的是x64的,那么你的桌面程序就要选择anycpu或x64发布,而web项目是不兼容的,不管你是如何发布的;

      如果下载安装的是x86的,那么你的桌面程序就要选择x86发布,而web项目正常发布就好;

    *总结:如果你是web项目,你就下载x86的,发布选anycpu就好了,然后设置应用程序池32位兼容就好了;

    *最后说一句,用这个,是不需要安装office软件的;

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     

      3、连接字符串

      主要如下两种情况:

      1)使用Office 2007 OLEDB驱动程序(ACE 12.0)连接到较旧的97-2003 Excel工作簿。

      Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myOldExcelFile.xls;
      Extended Properties="Excel 8.0;HDR=YES";
         “HDR =Yes;” 表示第一行包含列名,而不是数据。“HDR =No;” 表明相反;

      2)读取xlsx格式的excel

      Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;
      Extended Properties="Excel 12.0 Xml;HDR=YES";
        “HDR =Yes;” 表示第一行包含列名,而不是数据。“HDR =No;” 表明相反;
     
      Microsoft.ACE.OLEDB连接字符串参考地址:https://www.connectionstrings.com/ace-oledb-12-0/
     
     

    Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别

     

    2、不同点:

    1)对于不同版本的Excel,有两个接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称Jet引擎)

    和microsoft.ace.oledb.12.0(以下简称ACE引擎)。Jet引擎可以访问office 97-2003,但是你无法

    访问office 2007。ACE引擎是与Office 20,071一起发布的数据库连接组件,您可以访问Office 

    2007或Office 97-2003。

    2)microsoft.ace.oledb.12.0可以访问正在打开的Excel文件,而microsoft.jet.oledb.4.0是不可

    能的。因此,在使用不同版本的Office时,请注意使用正确的引擎。

    扩展资料:

    从2007版本开始,Access包含特定于Office的Jet版本,最初称为Office Access连接引擎

    (ACE),但现在称为Access数据库引擎。此引擎完全向后兼容以前版本的Jet引擎,因此它从早期

    的Access版本读取和写入(.mdb)文件。

    它引入了一种新的默认文件格式(.accdb),它为Access带来了一些改进,包括复杂数据类型,如

    多值字段,附件数据类型和备注字段中的历史记录跟踪。它还带来了安全性和加密性改进,并支持

    与Microsoft Windows SharePoint Services 3.0和Microsoft Office Outlook 2007的集成。

     
     
    在通过ADO对Excel对象进行连接时(此时Excel则认为是一个数据源),需要配置对Excel数据源对应的连接串,这个连接串中包括了Provider信息(其实类似对数据库进行连接操作时,都需要指定连接字符串),以下是一行连接串源代码:
    strConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strExcelFilePath & ";Extended Properties=Excel 12.0"
    这里的Provider使用了Microsoft.ACE.OLEDB.12.0,其实除了Microsoft.ACE.OLEDB.12.0,还有Microsoft.Jet.OLEDB.4.0,它们俩者之间有什么联系和区别呢:

    共同点:都是做为连接Excel对象的接口引擎
     


    作者:willingtolove

    出处:http://www.cnblogs.com/willingtolove/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    NOI2014题解
    BZOJ 3514 (动态树)
    [HNOI 2013] 旅行 (数学)
    [HNOI 2013] 消毒 (搜索,二分图匹配)
    大学的第一个自己的程序
    回归了
    OI——不后悔的两年
    对于民科吧s5_or吧友自增树的复杂度计算
    好久没有冒过泡了。。。
    非常无聊——STD::sort VS 基数排序
  • 原文地址:https://www.cnblogs.com/niewd/p/11821497.html
Copyright © 2011-2022 走看看