0

我的目标是能够使用我的 web.config 文件中的连接字符串从 IIS 7 中的 Windows Server 2008 上运行的 ASP.NET 应用程序读取 Oracle 数据库。请注意,我正在使用企业库 5 语法。从我读过的论坛中,它告诉我我需要 x64 版本的 Oracle 客户端。因为我有旧版 DLL 文件,所以我现在想以 x86 运行。这甚至可能吗?如果我将 x64 与 x86 DLL 文件一起引入,将会引入更多复杂性,但如果这是我唯一的选择,请告诉我如果无法将 Oracle 客户端作为 x86 运行,如何做到这一点。

我的应用程序在这一行抛出异常:

using (IDataReader dataReader = db.ExecuteReader(command))

例外:

尝试加载 Oracle 客户端库会引发 BadImageFormatException。在安装了 32 位 Oracle 客户端组件的 64 位模式下运行时会出现此问题。

当我在 Visual Studio 2010 中右键单击该项目时,它显示我的平台设置为“活动(任何 CPU)”。平台目标设置为“x86”。

在 IIS 7(在 Windows Server 2008 上)中,我将启用 32 位应用程序属性(在我的网站应用程序池的高级设置下)设置为“真”。

Windows 环境变量“路径”具有“D:\oracle\product\11.1.0\client_1\bin;” 为 Oracle 路径设置。

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Data.SqlClient;
using System.Data.Odbc;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.ServiceLocation;
using System.Data.Common;
using Web.Controls.Shared;
using System.Data;
using System.Text;

...

    static List<DWObject> GetOracleTables(string databaseGroup)
    {
        Database db = DatabaseFactory.CreateDatabase(databaseGroup);
        StringBuilder getQuery = new StringBuilder
            (@"select table_name from all_tables");

        List<DWObject> objectList = new List<DWObject>();

        DbCommand command = db.GetSqlStringCommand(getQuery.ToString());

        // Attempt to load Oracle client libraries threw BadImageFormatException.  This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
        // It can't find a 64-bit version of the Oracle client libraries.  This has nothing to do with the .NET framework, please contact Oracle for support.
        using (IDataReader dataReader = db.ExecuteReader(command))
        {
            while (dataReader.Read())
            {
                if (dataReader["table_name"] != DBNull.Value)
                {
                    DWObject dwo = new DWObject();
                    dwo.dwobject_name = dataReader["table_name"].ToString();
                    objectList.Add(dwo);
                }
            }
        }

        return objectList;
    }

通过服务帐户的连接字符串:

  <add name="TestDatabase" connectionString="server=xxx;Data Source=xxx;User ID=xxx;password=xxx;" providerName="System.Data.OracleClient"  />

编辑 2015 年 7 月 17 日:

有趣的是,我在这里找到了自己的帖子。现在我得到了一个不同的错误。但我正在尝试相同的解决方案。

db.ExecuteNonQuery(dbCommand);

Microsoft.Practices.EnterpriseLibrary.Data.dll 中出现“System.Exception”类型的未处理异常

附加信息:System.Data.OracleClient 需要 Oracle 客户端软件版本 8.1.7 或更高版本。

4

1 回答 1

0

我刚刚下载了 32 位 Oracle 客户端。

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098987.html


现在,今天我发现了为什么会出现此错误。

附加信息:System.Data.OracleClient 需要 Oracle 客户端软件版本 8.1.7 或更高版本。

version 8.1.7上面的错误与任何设置无关!我在我的 PC 上遇到了另一个问题,即 Windows 无法访问 %windir%,这意味着 Windows 无法访问任何环境变量,因为它们可以通过 %windir% (C:\Windows\System32) 文件夹访问。在此期间 Windows 中的另一个奇怪行为是在此 %windir% 文件夹中找到的任何程序或图标都会导致这些程序显示一个虚拟图标(例如,附件 > 画图、Windows 资源管理器、命令提示符、远程桌面连接等... )。今天,我在开始菜单中右键单击其中一个没有图标的程序,然后选择“以管理员身份运行”,现在图标显示了!现在 Visual Studio 没有抛出这个错误。我的控制台应用程序出现了一个全新的错误。这个新错误是由于项目属性 > 构建 > 平台目标 > 任何 CPU 值。我从任何 CPU 更改为 x86 以解决错误。

DataTable dt = db.ExecuteDataSet(dbCommand).Tables[0];

Microsoft.Practices.EnterpriseLibrary.Data.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:尝试加载 Oracle 客户端库引发了 BadImageFormatException。在安装了 32 位 Oracle 客户端组件的 64 位模式下运行时会出现此问题。

于 2013-07-15T15:10:20.867 回答