我正在尝试使用Devart的dotConnect for Oracle试用一个简单的概念验证,因为我们目前使用的是.Net框架OracleClient(由于被弃用)但我们还要求在没有需要Oracle客户端甚至是Instant Client。出于这个原因,我试图向我的老板证明dotConnect是工作的工具,因为它具有直接模式和使用Enterprise Library 5(在我们的数据访问层中使用)的能力。我按照Devart提供的示例进行操作,包括在app.config中添加自定义提供程序映射到测试应用程序中。这一切似乎都在我的开发机器上工作,无论是在IDe还是作为编译应用程序,所以我把它包装在一个简单的设置和部署项目中,构建一个msi,然后将它安装在一个vanilla x 786虚拟机上没有安装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" />
这是来自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 Direct模式切换),这很有意义。
我无法看到我在提供者映射方面做错了什么。我之前没有使用它,但是我使用EL配置工具来确保它是正确的,自定义库包含在可执行文件(以及其他EL库)中。我看了几个例子,所有这些都表明我有正确的配置,所以我错过了什么?这让我疯了。
答案 0 :(得分: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,那么数据库将不会被注册,当您尝试访问数据库时,您将收到无法在容器中找到该对象的消息。