0
OS: Windows 7 64bit
VB: Visual Studio 2010
Oracle Client: 11g

我正在开发一个连接到 Oracle 11g 服务器的应用程序。我能够通过 Oracle SQL Developer、ODBC(在 SYSWOW64 中)和 VB Server Explorer 连接到 Oracle 服务器。

我正在使用位于以下位置的 .NET 参考 Oracle.DataAccess:C:\Oracle\product\11.2.0\client_32\ODP.NET\bin\2.x\Oracle.DataAccess.dll

我已尝试按照其他问题的建议将 .DLL 文件添加到我的 bin 文件夹中,但这不起作用。

有没有人有任何其他建议?

当我运行我的应用程序时,我得到以下信息: 在此处输入图像描述

以下是详细信息:

System.TypeInitializationException was unhandled
  Message=The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.
  Source=Oracle.DataAccess
  TypeName=Oracle.DataAccess.Client.OracleConnection
  StackTrace:
       at Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
       at Orc_Test_1.Form1.Button1_Click(Object sender, EventArgs e) in c:\Visual Studio 2010\Projects\Orc_Test_1\Orc_Test_1\Form1.vb:line 9
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at Orc_Test_1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: Oracle.DataAccess.Client.OracleException
       DataSource=""
       ErrorCode=-2147467259
       Message=The provider is not compatible with the version of Oracle client
       Number=-11
       Procedure=""
       Source=Oracle Data Provider for .NET
       StackTrace:
            at Oracle.DataAccess.Client.OracleInit.Initialize()
            at Oracle.DataAccess.Client.OracleConnection..cctor()
       InnerException: 

VB.NET 代码:

Imports System.Data
Imports Oracle.DataAccess.Client ' ODP.NET Oracle managed provider
Imports Oracle.DataAccess.Types

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim oradb As String = "Data Source=SERVER1;Persist Security Info=True;User ID=username;Password=password;Unicode=True" 'From Server Explorer
        'Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=Server1.host.net)(PORT=1522))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=Server1))); USER ID = username;Password = password;" 'From TNSnames.ora
        Dim conn As New OracleConnection(oradb)  '<--- Error happens on this line
        conn.Open()
        Dim cmd As New OracleCommand
        cmd.Connection = conn
        cmd.CommandText = "select system_id from schema1.system_impacted where system_name = AWESOME"
        cmd.CommandType = CommandType.Text
        Dim dr As OracleDataReader = cmd.ExecuteReader()
        dr.Read()
        Label1.Text = dr.Item("system_id")
        conn.Dispose()
    End Sub
End Class
4

5 回答 5

3

我感觉到你的痛苦,刚刚在部署情况下经历了类似的事情。您可能安装了多个客户端,并且您的环境正在为旧版本提取 dll(即使您的项目中正确引用了最新的 oracle.dataaccess.dll)。在您的开发环境中解决此问题是一回事,而产品部署服务器则是另一回事。不确定您的部署情况是什么,但这对我有用。

在努力尝试在现有的 oracle home 中升级 odp.net、添加新的 oracle home 等之后,我发现解决所有问题的最简单方法是从 Oracle 下载带有 xcopy 部署的最新 odac,然后按照自述文件进行操作(请参阅此处对于这方面的旧文章也有)。基本上,您将运行一个 install.bat 文件以在本地进行设置(在单独的文件夹中,我的是 c:\oracle_odac),然后将您的项目引用更改为指向这个新文件夹中的 oracle.dataaccess.dll(我使用 4 而不是2.x),然后将新文件夹的 bin 目录添加到路径的前面(c:\oracle_odac\bin 和 c:\oracle_odac\odp.net\bin\4)。在您的部署服务器上,您只需复制整个 c:\oracle_odac 文件夹(通过 xcopy 或其他方式),并设置路径。

也就是说,我焦急地等待Oracle完全托管的 o​​dp.net的生产版本(现在处于测试阶段)。

编辑:只是补充一点,如果您在应用程序或 Web 配置文件中设置 dllpath,则可以避免弄乱 PATH。例如:

<configuration>
...
    <configSections>
      <section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>  
...

<oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="c:\oracle_odac\bin"/>
    </settings>
  </oracle.dataaccess.client>
...

这将覆盖其他设置,例如注册表或 machine.config。并且它将允许多个 odp.net 配置和平存在,并允许每个应用程序指向同一服务器上所需的版本。

于 2012-10-22T17:45:27.673 回答
1

通常在您构建 x64 应用程序时发生,该应用程序试图获取实际上不起作用的 x32 驱动程序。

在这种情况下你会做什么(这很痛苦):

  • 将 x32 oracle 客户端安装到 oraclehome1
  • 将 x64 oracle 客户端安装到 oraclehome2

确保您的应用程序构建(x64、x32)指向正确的 oraclehome。我手边没有那个代码,但我相信它类似于连接字符串中的“Home=oraclehome2”或类似内容。

于 2012-10-19T15:48:20.083 回答
1

我删除了“控制面板”的“程序”部分中可用的所有 Oracle 客户端。然后我进入注册表搜索“Oracle”并删除了 Oracle 客户端的所有实例/引用。在删除注册表并重新启动 3 小时后,我安装了 11g 客户端,一切都按预期工作。

注意:在注册表中搜索“Oracle”时,可能会引用 VB 版本的 Oracle,或者引用“Oracle”的 Crytsal Reports 驱动程序。我没有删除这些。因此,请注意要删除的注册表项的文件位置和/或语法。

/阅读。有用。

于 2012-11-12T15:53:58.617 回答
0

下载 ODAC 32/ ODAC 64 位,取决于 OS、VS 和 oracle 11g 的兼容性。使用 oracle 11g 32、os 32 位、oracle 32 位或 oracle 64 位、os 64 位和 oracle 11g 64 位。

于 2013-02-26T14:42:52.197 回答
0

根据我的经验,在尝试了 tbone 的建议、使用 PATH env 变量和其他不成功的游戏之后,立即起作用的解决方案是将下面列出的 8 个 DLL 文件的副本保存在 vb.net 可执行文件的同一文件夹中,然后在同一文件夹中添加对 Oracle.DataAccess.dll 的引用。

C:\Users\Legarcia\Documents\Visual Studio 2010\Projects\LabRetention\LabRetention\bin\Debug>dir *.dll
 Volume in drive C is OS
 Volume Serial Number is 10EC-8C5D

 Directory of C:\Users\Legarcia\Documents\Visual Studio 2010\Projects\LabRetention\LabRetention\bin\Debug

09/30/2008  07:57 PM           348,160 msvcr71.dll
10/01/2008  02:22 AM           520,192 oci.dll
10/01/2008  01:56 AM           352,256 ociw32.dll
08/12/2009  07:13 AM         1,011,712 Oracle.DataAccess.dll
09/18/2008  08:47 PM         1,130,496 orannzsbb11.dll
10/01/2008  01:48 AM           868,352 oraocci11.dll
10/01/2008  02:45 AM       117,604,352 oraociei11.dll
08/12/2009  07:21 AM           413,696 OraOps11w.dll
               8 File(s)    122,249,216 bytes
               0 Dir(s)  238,127,943,680 bytes free

在开发/测试/调试时,DLL 集被复制到 ..\projects\{Your project}\bin\Debug

例如:[C:\Users\Legarcia\Documents\Visual Studio 2010\Projects\LabRetention\LabRetention\bin\Debug]

为用户发布应用程序时,只需将 DLL 复制到 EXE 的相同目录即可

这似乎隔离了所有其他 Ora 客户端安装。

VB.net 应用程序中使用的连接字符串是根据其他客户端目录中的 TNSNAMES.ORA 文件中的信息创建的。

问候。

乐+

于 2014-07-31T20:04:45.657 回答