使用ODP.NET访问Oracle 12c数据库时的应用程序异常

时间:2018-01-27 01:16:03

标签: connection runtime-error app-config oracle12c odp.net

运行数据库应用程序时遇到以下错误异常:

''Oracle.DataAccess.Client.OracleConnection'的类型初始值设定项引发了一个异常。 ConfigurationErrorsException:无法识别的配置节oracle.dataaccess.client。

我多年来一直使用相同的技术来处理Oracle Collection用户定义类型(UDT),但在升级到Oracle 12c之后,我只是在尝试打开Oracle连接时收到了上述消息。

相关信息:

1)Visual Studio 2017

2)Oracle 12c第2版(这是我开发系统中唯一的Oracle软件)

3)开发CPU:AMD Phenom

4)Windows 10 Pro(64位)清洁安装

5)语言:VB.NET

6)Oracle.DataAccess(4.122.1.0 - 64位)我的开发CPU上只有这个.dll的一个副本。 (我已确认GAC中没有副本) 这是一个非托管的DLL;我很想使用托管版本,但Oracle没有包含我在托管版本中处理UDT所需的接口。

7)如果app.config文件不存在,我的应用程序运行时没有错误。

8)我提供了一个带有app.config文件的“裸骨”应用程序示例 (与完整的应用程序一样,它在没有配置文件的情况下运行时没有错误,但在配置文件存在时失败)

8)配置文件的设置部分是12c SYSTEM UDT实现的一个示例,但即使省略了UDT部分,此迷你应用程序也会失败并显示相同的错误消息。

9)目标CPU:x64

10)简单代码示例和配置文件:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '
    Dim cn As New Oracle.DataAccess.Client.OracleConnection
    '
    ' Change the following to your connection string        
    Dim cs As String = "Data Source=orcl;User Id=system;  Password=myOraclePW;"
   '
    cn.ConnectionString = cs
    '
    cn.Open()
    '
    MessageBox.Show("Oracle.DataAccess.Client.OracleConnection Open")
    '
    cn.Close()
    '
End Sub

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
  <configuration>

  <startup>        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup>

  <oracle.dataaccess.client>
    <settings><add name="OraSYSTEM.SYSTEM.AQ$_QUEUES.AQ$_SUBSCRIBERS" 
               value="udtMapping factoryName='myApp.ListFactory_1, myApp' typeName='AQ$_SUBSCRIBERS' schemaName='userPW' dataSource='SYSTEM'"/>
    </settings>
  </oracle.dataaccess.client>

</configuration>

这是我第一次向在线论坛提交问题,所以我希望最好!我相信自Oracle 11g和/或Visual Studio 2010以来发生了一些变化,我没有采取措施来适应这些变化,但对于我的生活,我不知道它是什么。 (我希望我忽略了一些小事和/或愚蠢的东西,但我已经没有“试试这个”的想法了)

感谢您的帮助和问候,

格雷格

1 个答案:

答案 0 :(得分:0)

1/28/2018更新:

解决问题!!!!

就像我想的那样,它是“小而愚蠢的东西”。 解决方案是使用Instant Client(64位)安装中的Oracle.DataAccess.dll而不是数据库安装中的安装。在没有app.config文件并使用数据库安装.dll的情况下让我的应用程序成功运行,我被抛弃了。 我还不确定为什么在安装Instant Client(和ODAC)时,只在GAC中安装了ODP.NET的托管版本,而不是非托管版本。 无论如何,在GAC加载优先于本地应用程序版本的情况下,无论哪种情况都应该涵盖。

希望这可能会为别人节省一些时间和痛苦。

格雷格