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

Posted

技术标签:

【中文标题】OleDbConnection.Open() 仅在一个项目中抛出异常,相同的代码在其他项目中有效【英文标题】:OleDbConnection.Open() throws exception only in one project, same code works in other projects 【发布时间】:2014-09-17 19:16:15 【问题描述】:
The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.

我知道常见的解决方法是安装:

Microsoft Access Database Engine 2010 Redistributable

或者

2007 Office System Driver: Data Connectivity Components

两者都安装在我的本地 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 连接字符串也一样!

编辑

Joe的回答之后,我看到这个项目是在64bitProcess上运行的:

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

我的驱动程序是 32 位的。我现在能做什么,能不能改变环境进程。我安装了 Office 2010 x32,无法安装 64 位进程的驱动程序。

【问题讨论】:

很可能与项目属性/构建/平台目标有关——通常使用 Any 是最好的,但有时您需要选择 x86 或 x64 来让 .NET 加载正确位数的程序集 @MatthewMartin 我加载 x64 重建并出现同样的问题。 您的驱动程序是 64 位的吗?如果没有,则选择 x86。 @LarsTech 如果我尝试将 x86 放入项目未加载,我将编辑异常。他们想更改注册键值,但我还找不到这个注册表。 【参考方案1】:

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)。

【讨论】:

你是对的,这个项目的环境是64位,其他是32。我怎样才能改变项目的环境,可以吗?我无法安装 64 位驱动程序,因为我的 windows 安装了 32 位版本的 Office。 您可以尝试通过检测位数或仅使用新字符串进行尝试/捕获/重试来动态更改 con 字符串(32/64 不同)。然后编译到任何 CPU。我现在没有精力去测试这个想法,一切都是 64 位的 好的,谢谢你的回答,我会接受的。如果你知道,你能解释一下这个项目是如何在 64 和 32 上运行的。提前谢谢你。 @Joe 我让它工作,我明白为什么它是 64 位,因为应用程序池不允许 32 位应用程序。非常感谢您的提示!!!【参考方案2】:

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

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

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

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001

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

【讨论】:

以上是关于OleDbConnection.Open() 仅在一个项目中抛出异常,相同的代码在其他项目中有效的主要内容,如果未能解决你的问题,请参考以下文章

C# DataTable 更新 Access 数据库

startUpdatingLocation 仅在 wifi 开启时有效,但仅在 3G 开启时无效

仅在注册期间仅在 wifi 上出现 409 冲突错误

CORS 仅在 Firefox 和 Safari 上且仅在 onClick() 上阻止内容

MPMoviePlayerController 仅在调用两次时播放。仅在 iOS 4 中出现

如何仅在 Angular 的某些页面上显示标题组件(现在它仅在重新加载时显示)