2012-04-11 71 views
2

我試圖獲得一個簡單的概念證明工作,使用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庫)中。我看了幾個例子,所有這些都表明我有正確的配置,所以我錯過了什麼?這讓我瘋狂。

回答

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庫,所以我不知道版本或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

相關問題