【问题标题】:Devart dotConnect For Oracle and Enterprise Library Custom Provider MappingsDevart dotConnect For Oracle 和 Enterprise Library 自定义提供程序映射
【发布时间】:2012-04-11 16:35:06
【问题描述】:

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

它只是不想工作。测试执行一个简单的选择语句并在列表视图中显示结果(如果有的话 - 如果没有,您会收到一条消息)。我实际上并不关心结果本身,而只是得到它们的行为。问题是当我执行测试时,我得到了无用的 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" />

这是来自 app.config 的连接字符串:

<add name="Testing26_devart" connectionString="User Id=Testing26;Password=Testing26;Server=ORACLE-SERVER;Direct=True;Sid=DEVORA;Port=1523;"
        providerName="Devart.Data.Oracle" />

我知道这个错误可能是由于使用了错误的连接字符串名称(除其他外)造成的,但我知道这是正确的,因为我首先从配置文件中检索了它。这也与开发环境中使用的配置完全相同。内部异常是这样的:

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.OracleClient,那么它完全没有问题找到连接字符串,而是抱怨不支持的关键字 Direct(来自 dotConnect直接模式切换),这是有道理的。

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

【问题讨论】:

    标签: oracle enterprise-library provider devart dotconnect


    【解决方案1】:

    听起来好像没有配置 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 库,所以我不确定 Version 或 PublicKeyToken 是什么。

    如果 Enterprise Library 找不到 DbProviderFactory,则不会注册数据库,当您尝试访问数据库时,您将收到在容器中找不到对象的消息。

    【讨论】:

    • Tuzo 你发现了 - dotConnect 的安装程序将条目添加到 machine.config 但在文档中的任何地方都没有提到这一点(我可以看到),因此它在开发机器。当我将这个部分添加到我的 app.config 中后,它就开始活跃起来,并且完全按照我的预期进行。非常感谢 - 我花了 2 天时间尝试使用 fuslogvw、进程监视器等工具找出问题所在。
    • @StevePettifer,您似乎没有注意产品文档中的这篇文章:devart.com/dotconnect/oracle/docs/Deployment.html。您可以在其中找到您需要的所有信息。
    • @Devart - 我确实阅读了该文档,但不清楚在使用获取数据库实例的新 EL5 方法时是否需要这个(事实证明)大大抽象了 DbProviderFactories,除非你碰巧知道那已经。也没有说您的安装程序将其添加到 machine.config 这是关键遗漏。我建议您不要在安装期间在 machine.config 中添加 DbProviderFactories 条目,而是在文档中明确说明它必须添加到 app.config/web.config (或者,如果这是用户想要的, machine.config) 手动。
    • @StevePettifer - 谢谢,您的意见对我们很重要。我们将审查我们的文档并考虑如何改进它。
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多