【问题标题】:Visual Studio 2015 and Oracle 32/64 bit issueVisual Studio 2015 和 Oracle 32/64 位问题
【发布时间】:2019-06-13 17:34:07
【问题描述】:

我是一名开发 Windows 窗体应用程序的应用程序开发人员。我一直在一台带有 oracle 客户端 11g 和 MS Office 32 位的 Windows 10 64 位机器上进行开发。我的公司正在做很多升级。我现在有 Office 64 位。我不再可以使用 11g 客户端访问 oracle,但我的 Visual Studio 开发工作正常,我可以连接到 oracle 服务器。现在他们正在升级到 Oracle 客户端 12.1。有 64 位和 32 位版本。如果我安装 64 位,我通过 ms 访问与 oracle 的连接工作正常,但现在尝试在 Visual Studio 中连接失败。所以我也安装了 32 位 oracle 客户端。但它仍然不起作用。我不知道该怎么办。如何使用我的 oracle 连接让我的数据集再次工作?

我可以添加 oracle 服务器并在服务器资源管理器中查看表,但是当我尝试在我的程序中连接到 oracle 时,我得到 ORA-12154: TNS:could not resolve the connect identifier specified。我的 TNSNAMES.ora 文件已设置。它如何知道使用 32 位或 64 位的 Oracle。我正在使用 Oracle.ManagedDataAccess

Imports Oracle.ManagedDataAccess
    Dim conn As New OracleConnection
    Dim oradstr As String = EMS.My.Settings.ORAD_Conn
    Dim orapstr As String = EMS.My.Settings.ORAP_Conn

    constr = EMS.My.Settings.ORAD_Conn
    constr = constr.Replace("{username}", Trim$(UsernameTextBox.Text))
    constr = constr.Replace("{pwd}", PasswordTextBox.Text)
    My.Settings.RunTimeConnectionString_ORAD = constr

    conn = New OracleConnection
    conn.ConnectionString = My.Settings.ORAD_Conn
    conn.Open()
    conn.Dispose()
    conn.Close()

【问题讨论】:

    标签: oracle visual-studio-2015 32bit-64bit oracleclient


    【解决方案1】:

    你混合了几个问题。如果没有任何错误消息,像“仍然不起作用”这样的语句并不是很有帮助。

    如果您喜欢使用 32 位和 64 位 Oracle 客户端,请按照以下说明操作:BadImageFormatException. This will occur when running in 64 bit mode with the 32 bit Oracle client components installed

    通过这样的安装,它可以以任何一种方式工作。

    在您的代码中,您使用 ODP.NET Managed 驱动程序。这里不管你用的是32位还是64位,所以报错和上面的不一样。

    问题是不同的驱动程序使用不同的路径来分配tnsnames.ora 文件(参见Determining location of relevant tnsnames.ora file)。

    ODP.NET 托管驱动程序与许多其他驱动程序之间最重要的区别是:ODP.NET 托管驱动程序不读取您的注册表,而其他人读取密钥 HKLM\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN,resp。 HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN

    通过环境变量TNS_ADMIN 定义tnsnames.ora 的位置,或者在您的.NET 配置文件中配置它。我认为最简单的方法是OraProvCfg.exe 工具:

    set Oracle_x64=c:\oracle\product\12.1\Client_x64\odp.net
    set OraProvCfg_x64=%Oracle_x64%\bin\4\OraProvCfg.exe
    
    set Oracle_x86=c:\oracle\product\12.1\Client_x86\odp.net
    set OraProvCfg_x86=%Oracle_x86%\bin\4\OraProvCfg.exe
    
    set TNS_ADMIN=C:\oracle\network\admin
    
    "%OraProvCfg_x64%" /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll /set:settings\TNS_ADMIN:%TNS_ADMIN%
    "%OraProvCfg_x86%" /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:%Oracle_x86%\managed\common\Oracle.ManagedDataAccess.dll /set:settings\TNS_ADMIN:%TNS_ADMIN%
    

    【讨论】:

    • 我正在使用 ODP.NET 托管驱动程序,所以它不应该工作。在环境变量中,我在路径变量中有 64 位和 32 位路径。我的应用程序的用户可能仍在使用 11g,有些可能正在使用 12.1 32 或 64 位,那么我该如何弥补这一点。我感到很困惑。我不擅长 oracle 的东西
    • 我已将 tns_admin 添加到环境变量中。仍然收到 tns 无法解决错误
    • 在 oraprovcfg 中您已将 tns_admin 设置为 network/admin,但是哪个,在 64 位文件夹或 32 位文件夹中的一个
    • 对于TNS_ADMIN,您应该为 32 位和 64 位客户端使用一个通用位置。文件Oracle.ManagedDataAccess.dll 是完全相同的文件,无论您是采用32 位还是64 位安装。您有 32 位和 64 位的 .NET 配置文件,因此您可以运行不同的 OraProvCfg.exe 以进行相应的配置。
    • 同时拥有 32 位和 64 位路径无济于事 - 先到先得。如果首先出现 32 位文件夹,则 64 位应用程序将失败(反之亦然) - 除非您使用链接指令中的特殊设置。否则,您必须在每次启动应用程序之前修改您的%PATH%
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多