2013-05-14 21 views
1

背景: 本網站使用oracle和spring.net。
版本Oracle.DataAccess的:4.112.2.0
版的春天:1.3.2.40943
Oracle.DataAccess.Client錯誤

Webconfig文件

<db:provider id="SDDbProvider" provider="Oracle.DataAccess.Client" 
      connectionString="User Id=****; Password = *****; Data Source = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=****)(PORT=****))(CONNECT_DATA=(SERVER=dedicated)(SERVICE_NAME=*****)))" /> 

這是工作在調試模式下的罰款。並且我在本地IIS(7.5)&上發佈了這個網站,這也正常運行。 但是,當我將發佈的文件夾複製到遠程服務器(也運行IIS 7.5)時,它給出了下面的錯誤。

注:我查了一下斌發佈的文件夾中,它擁有所有必要的DLL甲骨文

OCI
ociw32
Oracle.DataAccess
orannzsbb11
oraocci11
oraociei11
OraOps11w

Error thrown by a dependency of object 'Oracle.DataAccess.Client' defined in 'assembly [Spring.Data, Version=1.3.2.40943, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml] line 400' : Unsatisfied dependency expressed through constructor argument with index 2 of type [System.Type] : Could not convert constructor argument value [Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342] to required type [System.Type] : Cannot convert property value of type [System.String] to required type [System.Type] for property ''. 
while resolving 'constructor argument with name dbmetadata' to 'Spring.Data.Common.DbMetadata#195EA5D' defined in 'assembly [Spring.Data, Version=1.3.2.40943, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml] line 400' 


[UnsatisfiedDependencyException: Error thrown by a dependency of object 'Oracle.DataAccess.Client' defined in 'assembly [Spring.Data, Version=1.3.2.40943, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml] line 400' : Unsatisfied dependency expressed through constructor argument with index 2 of type [System.Type] : Could not convert constructor argument value [Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342] to required type [System.Type] : Cannot convert property value of type [System.String] to required type [System.Type] for property ''. 
while resolving 'constructor argument with name dbmetadata' to 'Spring.Data.Common.DbMetadata#25C456C' defined in 'assembly [Spring.Data, Version=1.3.2.40943, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml] line 400'] 
    Spring.Objects.Factory.Support.ObjectDefinitionValueResolver.ResolveInnerObjectDefinition(String name, String innerObjectName, String argumentName, IObjectDefinition definition, Boolean singletonOwner) +385 
    Spring.Objects.Factory.Support.ObjectDefinitionValueResolver.ResolvePropertyValue(String name, IObjectDefinition definition, String argumentName, Object argumentValue) +278 
    Spring.Objects.Factory.Support.ObjectDefinitionValueResolver.ResolveValueIfNecessary(String name, IObjectDefinition definition, String argumentName, Object argumentValue) +19 
    Spring.Objects.Factory.Support.ConstructorResolver.ResolveConstructorArguments(String objectName, RootObjectDefinition definition, ObjectWrapper wrapper, ConstructorArgumentValues cargs, ConstructorArgumentValues resolvedValues) +1385 
    Spring.Objects.Factory.Support.ConstructorResolver.GetConstructorInstantiationInfo(String objectName, RootObjectDefinition rod, ConstructorInfo[] chosenCtors, Object[] explicitArgs) +218 
    Spring.Objects.Factory.Support.ConstructorResolver.AutowireConstructor(String objectName, RootObjectDefinition rod, ConstructorInfo[] chosenCtors, Object[] explicitArgs) +79 
    Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateObjectInstance(String objectName, RootObjectDefinition objectDefinition, Object[] arguments) +278 
    Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.InstantiateObject(String name, RootObjectDefinition definition, Object[] arguments, Boolean allowEagerCaching, Boolean suppressConfigure) +1204 
    Spring.Objects.Factory.Support.AbstractObjectFactory.GetObjectInternal(String name, Type requiredType, Object[] arguments, Boolean suppressConfigure) +2216 
    Spring.Objects.Factory.Support.AbstractObjectFactory.GetObject(String name, Type requiredType) +21 
    Spring.Data.Common.DbProviderFactory.GetDbProvider(String providerInvariantName) +81 
    Spring.Data.Common.DbProviderFactoryObject.CreateProviderInstance() +18 
    Spring.Data.Common.DbProviderFactoryObject.GetObject() +205 
    Spring.Objects.Factory.Support.AbstractObjectFactory.GetObjectFromFactoryObject(IFactoryObject factory, String objectName, RootObjectDefinition rod) +98 

[ObjectCreationException: Error creating object with name 'SDDbProvider' : FactoryObject threw exception on object creation.] 
    System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +4649821 
    System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +325 
    System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407 
    System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375 

[HttpException (0x80004005): Error creating object with name 'SDDbProvider' : FactoryObject threw exception on object creation.] 
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11529072 
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141 
    System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4784373 

任何想法爲什麼發生這種情況?它與遠程服務器中的GAC有關嗎? 謝謝

回答

5

我一個星期我想以後修復了這個問題。想分享我的經驗。

首先,這個錯誤消息與Spring框架有關。基於我們在配置文件中指定的DBprovider(在我的情況下,它是Oracle.DataAccess.Client),Spring.Data DLL嘗試解析數據庫提供程序。 (More about Spring dbproviders

它使用資源文件(Spring.Data.Common.dbproviders.xml)來解決此問題。在dbproviders.xml文件中從以下行中拋出的錯誤。 (文件位置:Spring.Net/src/Spring/Spring.Data/Data/Common/dbproviders.xml)

<constructor-arg name="connectionType" value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/> 

出於某種原因dbproviders.xml試圖找到Oracle.DataAccess DLL在GAC(窗口/組件/ GAC)。根據我的經驗不是查看bin文件夾。如果它無法在GAC中找到該DLL,則會拋出上述錯誤消息。 因此,我使用GACUtil在GAC中安裝了Oracle.DataAccess(版本2.102.4.0)DLL。我認爲它也看起來是在dbproviders.xml中指定的版本。 (如果我錯了,請隨時在這裏發表評論)

這是Spring框架。但是爲了工作NHibernate,你應該有Oracle。在您的BIN文件夾中的DataAccess DLL(否則它會拋出「提供程序與Oracle客戶端版本不兼容」錯誤)和相關的Oracle即時客戶端在相同的位置(否則它會拋出「無法加載文件或程序集'Oracle .DataAccess'或它的一個依賴關係,試圖加載一個格式不正確的程序。「錯誤)。

如果您使用oracle即時客戶端(很確定大家都知道),您不必在機器上安裝oracle客戶端。在我的bin文件夾中,我放置了Oracle.DataAccess(版本4.112.2.0)和即時客戶端DLL(如問題中所述)。我使用版本4.112.2.0,因爲我無法找到版本2.102.4.0的即時客戶端DLL。 (我知道這是一團糟,但這就是它的工作原理)

所以現在一切正常。

小提示:如果有人想在遠程服務器中使用GacUtil並且不想安裝.net framework SDK,請將gacutil.exe和gacutil.exe.config文件複製到遠程服務器並在其中運行。確保使用version =「v2.0.50727」。如果使用version =「v4.0.30319」,那麼它會將DLL添加到C:\ Windows \ Microsoft.NET \ assembly而不是C:\ Windows \ assembly。

+2

+1用於此處的報告 – Marijn 2013-05-22 10:11:43

0

Oracle的Windows客戶端是最糟糕的。你有我的同情心。

您在檢查GAC時處於正確的軌道上。特別要密切關注任何Oracle.DataAccess.Policy條目。這些允許Oracle承擔版本之間的向後兼容性。在同一臺計算機上安裝多個版本的Oracle客戶端時,Oracle安裝程序可能會對使用哪個版本做出一些錯誤的假設。如果可能的話,我建議只安裝1版本的Oracle,或者至少在GAC中配置1個版本。

檢查這個線程幫助調試問題: https://forums.oracle.com/forums/thread.jspa?threadID=415012

+0

感謝您的回覆。 我檢查了GAC(C:\ Windows \ assembly),並在我的本地機器上安裝了Oracle.DataAccess DLL。 但不在遠程服務器中。我不想在服務器上安裝oracle。 問題是應用程序根本不檢查它的BIN文件夾。 (我從BIN文件夾中刪除了所有的oracle dll,但它仍然顯示相同的錯誤) 對我來說,它看起來像檢查GAC並抱怨! 有沒有辦法在Spring上配置它? 感謝 – 2013-05-15 16:15:20

1

確保您在64位處理器上編譯。許多環境默認爲32位,並且不會識別64位dll。