2

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

它只是不想工作。测试执行一个简单的选择语句并在列表视图中显示结果(如果有的话 - 如果没有,您会收到一条消息)。我实际上并不关心结果本身,而只是得到它们的行为。问题是当我执行测试时,我得到了无用的 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.OracleClientthen 它完全没有问题找到连接字符串,而是抱怨不支持的关键字Direct(来自 dotConnect Direct 模式开关),这是有道理的。

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

4

1 回答 1

2

听起来 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,则不会注册数据库,当您尝试访问数据库时,您将收到在容器中找不到对象的消息。

于 2012-04-11T18:37:13.567 回答