枚举MS Enterprise Library中的DbProviderFactories会返回不同的结果

时间:2016-03-02 15:14:10

标签: .net odp.net system.data enterprise-library-6

我有多个应用程序使用MS Enterprise Library和Oracle ODP.Net驱动程序连接到Oracle。

在尝试创建与Oracle DB的连接时,一个应用程序(Windows服务)会抛出以下错误:

数据库' MyDBName'的连接字符串不存在或没有有效的提供者。

另一个应用程序,一个Web服务,做同样的事情,它工作正常。两者都在我的计算机上本地运行。

在Windows服务中,我检查了显而易见的事实:连接字符串实际上就在那里,名称拼写正确,而Db提供程序,Oracle.DataAccess.Client就在那里拼写正确。我还确认在machine.config中正确安装和配置了ODP.net(它必须是因为Web服务正常工作)。 web和win服务都使用.net 4.5.1。所以我相信已经排除了所有显而易见的事实。

单步执行lib代码我发现异常的来源是因为在windows服务下调用此方法时返回false:

private static bool IsValidProviderName(string providerName)
{
    return DbProviderFactories.GetFactoryClasses().Rows.Find(providerName) != null;
}

在Web服务下运行时返回true。在这两种情况下,提供的providerName的值都是相同的(Oracle.DataAccess.Client)。然后我查看了GetFactoryClasses()返回的Rows,并意识到在windows服务下,只有少数(大约一半)已注册的工厂类从machine.config返回,而Oracle不在其中。这就是它失败的原因。为了解决这个问题,我已将以下内容添加到我的服务的app.config中:

<DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client"/>
      <remove invariant="Oracle.DataAccess.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.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <add name="ODP.NET, Unmanaged Driver" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET, Unmanaged Driver" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

    </DbProviderFactories>

这些是直接从machine.config中复制出来的。

所以我的问题基本上是,为什么在枚举注册的DbProviderFactories时,在相同版本的.net下运行的两个应用程序不能产生一致的结果?

0 个答案:

没有答案