“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机注册。

573

我正在尝试在按钮单击事件中从Excel文件中获取数据。我的连接字符串是:

 string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\source\\SiteCore65\\Individual-Data.xls;Extended Properties=Excel 8.0;";

当我点击按钮时,我得到了以下错误:

'Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机上注册。

我不知道如何解决这个问题。我的操作系统是Windows 7。


12
只是一个旁注:使用OLEDB读取Excel文件是过时的技术,速度非常慢,并且正如你所发现的,需要在目标计算机上手动安装额外的软件包。(诚然,这个问题是在2011年提出的。)最好使用ClosedXml(可在NuGet上获得),它可以直接使用。 - Shaul Behr
7
很抱歉,ClosedXML 只支持 .xlsx 格式的文件,不支持 .xls 格式。 - Jimmy
6
如果你正在导入到Sql Server中,你可以从ssms运行以下查询: execute master.dbo.xp_enum_oledb_providers它会告诉你它认为你有哪些提供商。它告诉我我有Microsoft.ACE.OLEDB.16.0和Microsoft.ACE.OLEDB.12.0两个提供商,但当我尝试导入数据时,对于Excel 16和Excel 2007文件格式(oledb.16.0和oledb.12.0),我得到了与OP相同的“未在本地计算机上注册”的错误。此时放弃微软软件是明智的选择。 - user1040323
1
还可以参考此答案 https://dev59.com/TGYq5IYBdhLWcg3wixJr#14401857,了解 Microsoft.Jet.OleDb 和 Microsoft.Ace.OleDb 之间的区别。 - Jeff Widmer
4
@user1040323,执行execute master.dbo.xp_enum_oledb_providers命令可以告诉你服务器上有哪些内容,而不是你的本地计算机 - Nathan Goings
6
这是可以工作的版本: 并没有真正记录,但我找到了一种安装32位和64位版本的方法。只需将命令行参数“/passive”添加到命令中即可:“C:\ directory path \ AccessDatabaseEngine_x64.exe” /passive_ - TaW
39个回答

1
我曾尝试多次卸载并重新安装"Microsoft Access Database Engine 2010 (English)",最终尝试了将选项从“ANY CPU”更改为“x86”,这样做有效了。
感谢您的评论,让我在两周的挫折后重获商机。

0

只需从Nuget包管理器中添加CsvReader即可。 它快速简便,无需像这样建立任何连接。 只需使用Nuget包管理器搜索并导入库:

using LumenWorks.Framework.IO.Csv;

代码:

var csvTable = new DataTable();   
using (var csvReader = new CsvReader(new         
StreamReader(System.IO.File.OpenRead(filePath)), true))   
{   
   csvTable.Load(csvReader);   
   string Column1 = csvTable.Columns[0].ToString(); //Read columns    
}

0

这取决于您安装的Office版本,如果您安装了x64位的Office,则必须将应用程序编译为x64位才能运行。因此,如果您想在x86上运行它,则必须安装x86版的Office。我尝试了以上所有解决方案,但都没有成功,直到我意识到我安装的是x64位的Office,所以我将应用程序构建为x64位,然后就可以运行了。


错误的,我已经安装了Office并且不得不安装DB连接器。 - AStopher
2
这解决了我的问题,当上述所有方法都对我无效时! - sam byte

0

记得在服务器上安装AccessDatabaseEngine以供Web应用程序使用。


0
  • 我已经面临了同样的问题好几天了。我安装了64位的OLEDB驱动程序,尝试了在微软网站上提供的32位版本。
  • 我还尝试重新安装了64位的Office版本,但不知道为什么没有起作用。我尝试将IIS池中的32位应用程序设置为true。
  • 我尝试更改项目环境为X86、AnyMachine、Mixed等,并几乎尝试了所有可以在互联网上找到的补丁。但是所有的解决方案都让我失望了。
  • 最终我发现我们下载的提供程序是最新的,但也无法使用。
  • 我卸载了它并安装了oledb驱动程序14.0.7015.1000。我没有链接,因为我从公司资源中获取了它,你可能需要在谷歌上搜索,但它有效。
  • 我在这个DOWNLOAD LINK上找到了一个版本为14.0.6119.5000的驱动程序,它也有效。

0

这对我现在起作用了。

  1. 访问此页面,然后下载适合您计算机的相应软件包(AccessDatabaseEngine.exeAccessDatabaseEngine_X64.exe
  2. 安装它。
  3. 享受... 您的代码现在可以工作了...

但是对于您的应用程序包,您可以使用以下任何解决方案之一:

  1. 进入C:\Program Files (x86)\Common Files\microsoft sharedC:\Program Files\Common Files\Microsoft Shared,并将OFFICE14目录放在与您的软件包文件相同的位置。

或者

  1. 将两个项目(在item1中)附加到您的安装包中。

0
在我的情况下,我没有意识到我的连接字符串中有一个实际上很重要的拼写错误。请注意提供程序结尾处的.0是必需的:
因此,以下内容是正确的:

PROVIDER=Microsoft.ACE.OLEDB.16.0;

这不是正确的:

PROVIDER=Microsoft.ACE.OLEDB.16;


0
我在不同的电脑上解决它的方法:

我有一台装有Visual Studio 2012的Windows 7 32位机器,因为我没有Office 2010,所以其中没有安装Access Database。我复制了与我的Windows 7 64位机器相同的源代码。

于是,我按照其他人建议从上面下载并安装了AccessDatabaseEngine到这台Windows 7 32位机器上,一切都正常工作了。

我的Windows 7 64位机器仍然有问题,因为它已经安装了包括Access 2010的Office 2010。我在这台电脑上解决的方法是进入项目,选择属性,在平台目标处选中了Any CPU并勾选了Prefer 32-bit。重新编译/构建后,“Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机注册”消息不再出现。

显然,我购买的Office默认安装为32位,除非你购买适用于64位机器的Office,我对此并不是很了解,但这是我的猜测 - 如果这是真的,我会更多地了解。如果我要充分利用64位,则必须下载AccessDatabaseEngine 64位版本,如上所建议。目前,由于我拥有的是32位引擎,因此我必须使我的应用程序优先选择32位CPU。 - Humbert

-9

//读取 .xls 文件

string strConnection = "";<br/>

string FileName = Server.MapPath("Student.xls");

strConnection = @"Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties='Excel 8.0; HDR=Yes;IMEX=1;'";<br/>

try
{
    OleDbConnection conn1 = new OleDbConnection(strConnection);
    conn1.Open();
    DataTable dt = new DataTable();
    dt = conn1.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });

    Object sheetName = dt.Rows[0]["TABLE_NAME"];
    dt.Clear();
    dt.Columns.Clear();
    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + sheetName.ToString() + "]", conn1);
    da.TableMappings.Add("Table", "0");
    da.Fill(dt);

    for (int i = 0; i < dt.Rows.Count; i++)
    {
        string ID = dt.Rows[i][0].ToString();
        string Name = dt.Rows[i][1].ToString();
        string City = dt.Rows[i][2].ToString();
        string Marks = dt.Rows[i][3].ToString();
    }
    conn1.Close();
}
catch
{
    throw;
}
//To Read xlsx file use following code
string strConnection = "";  <br/>
string FileName = Server.MapPath("Student.xlsx"); <br/>
strConnection = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties='Excel 12.0 Xml;HDR={1};IMEX=1;'";<br/>

try
{
    OleDbConnection conn1 = new OleDbConnection(strConnection);
    conn1.Open();

    DataTable dt = new DataTable();
    dt = conn1.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });

    Object sheetName = dt.Rows[0]["TABLE_NAME"];
    dt.Clear();
    dt.Columns.Clear();
    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + sheetName.ToString() + "]", conn1);
    da.TableMappings.Add("Table", "0");
    da.Fill(dt);
    //int idx=0;
    //int j=0;
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        string ID = dt.Rows[i][0].ToString();
        string Name = dt.Rows[i][1].ToString();
        string City = dt.Rows[i][2].ToString();
        string Marks = dt.Rows[i][3].ToString();
    }

    conn1.Close();
}
catch
{
    throw;
}

//现在从"http://www.microsoft.com/en-us/download/confirmation.aspx?id=23734"链接安装AccessDatabaseEngine.exe

它将百分之百有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接