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

问题描述:

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

它只是不想工作。测试执行一个简单的select语句,并在列表视图中显示结果(如果有的话 - 如果没有,您会收到一条消息)。我实际上并没有对结果本身产生困扰,而仅仅是为了得到它们。问题是,当我执行测试,我得到不断无益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库)中。我看了几个例子,所有这些都表明我有正确的配置,所以我错过了什么?这让我疯狂。

听起来好像没有配置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是什么。

如果Enterprise Library找不到DbProviderFactory,那么数据库将不会被注册,并且当您尝试访问数据库时,您将收到消息,指出在容器中找不到该对象。

+0

Tuzo你真的发现了 - dotConnect的安装程序将条目添加到了machine.config中,但在文档中我没有提到这一点(我可以看到),因此它在开发机器上完美地工作。只要我将该部分添加到我的app.config中,它就会立即生效,并且完全按照我的预期完成。非常感谢你 - 我花了2天的时间尝试解决使用fuslogvw,进程监视器等东西时出了什么问题。 – 2012-04-12 12:31:43

+0

@StevePettifer,似乎您没有在产品文档中关注此文章:http://www.devart.com/dotconnect/oracle/docs/Deployment.html。你可以找到你需要的所有信息。 – Devart 2012-04-13 08:18:49

+0

@Devart - 我没看过那个文档,但是在使用新的EL5获取数据库实例的方法时(如果实际上)抽象出DbProviderFactory,你不需要知道这一点,除非你已经知道了。也没有说你的安装程序将它添加到machine.config中,这是关键的省略。我建议你不要在安装过程中在machine.config中添加DbProviderFactories条目,而是在文档中明确指出它必须添加到app.config/web.config中(或者,如果这是用户想要的, machine.config)手动。 – 2012-04-13 09:52:22