用于Oracle和企业库自定义提供程序映射的Devart dotConnect

用于Oracle和企业库自定义提供程序映射的Devart dotConnect,oracle,enterprise-library,provider,devart,dotconnect,Oracle,Enterprise Library,Provider,Devart,Dotconnect,我正试图通过试用Devart的dotConnect for Oracle获得一个简单的概念证明,因为我们目前使用的是.Net framework OracleClient(由于不推荐),但我们也需要连接,而不需要Oracle客户端甚至即时客户端。出于这个原因,我试图向我的老板证明,鉴于dotConnect的直接模式和与Enterprise Library 5(用于我们的数据访问层)协作的能力,dotConnect是这项工作的工具。我遵循了Devart提供的示例,包括在测试应用程序的app.con

我正试图通过试用Devart的dotConnect for Oracle获得一个简单的概念证明,因为我们目前使用的是.Net framework OracleClient(由于不推荐),但我们也需要连接,而不需要Oracle客户端甚至即时客户端。出于这个原因,我试图向我的老板证明,鉴于dotConnect的直接模式和与Enterprise Library 5(用于我们的数据访问层)协作的能力,dotConnect是这项工作的工具。我遵循了Devart提供的示例,包括在测试应用程序的app.config中添加自定义提供者映射。这一切似乎都可以在我的开发机器上以IDe和编译应用程序的形式运行,因此我将其打包在一个简单的安装和部署项目中,构建了一个msi,然后将其安装在一个香草Win 7 x86虚拟机上,该虚拟机没有安装Oracle客户机进行测试

它只是不想工作。该测试执行一个简单的select语句,并在listview中显示结果(如果有-如果没有,您将收到一条消息)。事实上,我并不在乎结果本身,只在乎获得结果的行为。问题是当我执行测试时,我得到了一个永远没有帮助的EL错误:

Activation error occured while trying to get instance of type Database, key "Testing26_devart"
下面是令人不快的代码行:

Dim db As Database = EnterpriseLibraryContainer.Current.GetInstance(Of Database)(EnvironmentName)
以下是app.config文件中的提供者映射:

<add databaseType="Devart.Data.Oracle.EnterpriseLibrary.OracleDatabase, Devart.Data.Oracle.EnterpriseLibrary, Version=3.5.4456.40828, Culture=neutral, PublicKeyToken=null" name="Devart.Data.Oracle" />
我怀疑应该归咎于提供程序映射,因为如果我将连接字符串中的提供程序更改为
System.Data.OracleClient
,则它在查找连接字符串时一点问题都没有,而是抱怨不受支持的关键字
Direct
(从dotConnect直接模式开关),这是有道理的


我看不出我在提供者映射方面做错了什么。我以前没有使用过它,但我使用了EL配置工具来确保其正确性,自定义库包含在可执行文件(以及其他EL库)中。我看了几个例子,所有这些都表明我有正确的配置,那么我遗漏了什么呢?这让我抓狂。

听起来好像DbProviderFactory没有配置。可能在安装Devart软件时,它会在machine.config中安装DbProviderFactory。检查开发计算机上的machine.config以了解DbProviderFactory是否存在

如果不想修改machine.config,可以将配置信息添加到app.config中。它看起来像:

  <system.data>
    <DbProviderFactories>
      <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" 
description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle" />        
    </DbProviderFactories>
  </system.data>

我不熟悉Devart库,所以我不确定该版本或PublicKeyToken是什么


如果企业库找不到DbProviderFactory,则数据库将不会注册,当您尝试访问数据库时,您将收到一条消息,即在容器中找不到该对象。

Tuzo您所处的位置-dotConnect的安装程序将该条目添加到machine.config中,但在文档(我可以看到),因此它可以在开发机器上完美工作。当我把这个部分添加到app.config中时,它突然活跃起来,并完全按照我的预期做了。非常感谢您-我花了两天时间使用fuslogvw、process monitor等工具试图找出问题所在。@StevePettifer,您似乎没有注意产品文档中的这篇文章:。您可以在其中找到所需的所有信息。@Devart-我确实阅读了该文档,但在使用新的EL5方法获取数据库实例时,您是否需要这些信息(事实证明,这些方法相当抽象了DbProviderFactorys),除非您碰巧已经知道这一点。也没有说您的安装程序将其添加到machine.config,这是关键的遗漏。我建议您在安装过程中不要在machine.config中添加dbProviderFactorys条目,而是在文档中明确说明必须手动将其添加到app.config/web.config(或者,如果用户需要,添加到machine.config)。@StevePettifer-谢谢,您的意见对我们很重要。我们将回顾我们的文档并考虑如何改进它。
Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "Testing26_devart".

Exception occurred while: while resolving.

Exception is: InvalidOperationException - The type Database cannot be constructed. You must configure the container to supply this value.
  <system.data>
    <DbProviderFactories>
      <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" 
description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle" />        
    </DbProviderFactories>
  </system.data>