9

我无法让 ODP.NEt 库与 .NET DBProviderFactories 一起使用。我收到以下代码错误:

_DBFactory = DbProviderFactories.GetFactory(providerName);

为 system.data 创建配置节处理程序时出错:列“InvariantName”被限制为唯一。值“Oracle.DataAccess.Client”已存在。

使用此提供程序名称:Oracle.DataAccess.Client

以及 web.config 中的以下条目:

  <system.data>
    <DbProviderFactories>
      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

有谁知道出了什么问题?我不认为我在任何地方都设置了两次。

4

4 回答 4

8

如果您安装了 ODP.net(例如使用 oracle 通用安装程序,而不是 xcopy),您会在 machine.config 中找到相同的 DbProviderFactories/add。

所以在你的 web.config 中添加它就是第二次添加它——所以,复制 Oracle.DataAccess.Client!

于 2010-03-16T10:37:34.823 回答
6

你能做到以下吗?(注意“明确”)

  <system.data>
    <DbProviderFactories>

      <clear />

      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342" />

    </DbProviderFactories>
  </system.data>
于 2013-01-22T19:14:33.640 回答
2

应该注意的是,这<clear />将清除所有DbProviderFactories您可能不想做的事情,具体取决于您的情况。

您也可以在重新添加之前删除该类,方法是添加以下行:

<remove invariant="Oracle.ManagedDataAccess.Client" />

这是整体的<system.data>外观:

  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver"
           type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

如果您的本地计算机和服务器环境没有匹配的配置文件(例如 machine.config),这将很有用。

您可以做的另一件事就是将它从您的 web.config 中删除,假设您的 machine.config 中的设置将起作用。但是,我会在您的开发机器和服务器上对此进行测试。在我的情况下,它适用于一个但不是另一个,因为 machine.config 文件不匹配。为了解决这个问题,我在服务器上的 machine.config 中添加了相同的设置,但没有<remove invariant="Oracle.ManagedDataAccess.Client" />这样:

  <system.data>
    <DbProviderFactories>
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver"
           type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
于 2015-09-24T21:18:35.913 回答
1

很可能机器配置文件 DbProviderFactories 部分崩溃了。检查是否有多余的 Oracle.DataAccess.Client 行,卸载 oracle 客户端后仍然存在。

于 2017-09-30T18:10:29.570 回答