OleDbConnection.Open() 仅在一个项目中抛出异常,相同的代码在其他项目中有效


The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.

我知道常见的修复程序是安装:

Microsoft Access 数据库引擎 2010 可再发行组件

2007 Office 系统驱动程序:数据连接组件

两者都安装在我的本地PC上。这是我拥有的代码

        OleDbConnection conn = new OleDbConnection();
        string fileName = "test.xlsx";

        try
        {
            string connectString = String.Format(
                "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR={1};'",
                fileName, "YES");
            conn.ConnectionString = connectString;
            conn.Open(); //exception is thrown here !!!
            OleDbCommand comm = new OleDbCommand();
            comm.CommandText =
                string.Format("CREATE TABLE [{0}] ", "Test");
            comm.Connection = conn;
            comm.ExecuteNonQuery();
            OleDbDataAdapter ad = new OleDbDataAdapter(
                string.Format("SELECT * FROM [{0}]", "Test"), conn);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(ad);
        }
        catch(Exception ex)
        {
            throw ex;
        }
        finally
        {
            conn.Close();
        }

我在本地机器上的其他项目中尝试了此代码,一切正常。我有创建 excel 导出的项目,我没有这个问题。

问题出在项目中,我不明白如何解决它。同样在当前项目中,我创建了一个新的.aspx页面,Page_Load只放置此代码,相同的例外。

附加信息:此项目编写于 vs 2008,转换为 2010 年,之后在 vs 2012 中使用。到目前为止,项目中的一切都在工作。

JET连接字符串也是如此!

编辑

的回答之后,我看到这个项目在 64 位进程上运行:

bool test = Environment.Is64BitProcess; //return true.

我的驱动程序是 32 位的。我现在能做什么,我能改变环境过程吗?我无法安装 64 位进程的驱动程序,因为我已安装 Office 2010 x32。

32 位和 64 位应用程序的 OLEDB 驱动程序不同。

如果只安装了 32 位驱动程序,则尝试使用它的 64 位应用程序将收到此错误。 同样,如果仅安装了 64 位版本,则尝试使用它的 32 位应用程序将收到此错误。

你说:

我在本地机器上的其他项目中尝试此代码,一切正常

因此,必须正确安装两者中的至少一个。

要了解正在发生的事情,您可以检查有效和无效应用程序中的Environment.Is64BitProcess。 这将告诉您缺少哪个版本。

然后下载并安装以下版本中缺少的 32 位或 64 位版本:

http://www.microsoft.com/en-us/download/details.aspx?id=13255

您需要 AccessDatabaseEngine.exe(32 位(或 AccessDatabaseEngine_64.exe(64 位(

请注意,对于 Office 2010 版本,您可能需要将提供程序指定为"Microsoft.ACE.OLEDB.14.0"(12.0 适用于 Office 2007(。

几个小时后,我找到了一个解决方案:

步骤是什么,首先我尝试在 x86 上运行该项目 - Properties/Build/Platform Target.抛出异常,我无法重建,因为注册表是假的。我创建注册表。怎么做:

在记事本文件中粘贴此代码并将其保存为reg文件。使文件名记住为什么将来使用它(Fusion.reg(。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftFusion]
"EnableLog"=dword:00000001

之后,我遇到了一个问题,因为并非所有程序集都可以由应用程序池读取。关于这个问题的解决方案将IIS/Application Pools/Application Pool 4.0/General/Enable 32- Bit Applications.重新启动IIS之后,关闭项目并再次打开它,一切都可以使用32位版本。

相关内容

最新更新