7

मैं एंटरप्राइज़ लाइब्रेरी के ओडीपी.NET और संस्करण 4.1 का उपयोग करता हूं, 2008 बनाम। और सब ठीक है।प्रकार डेटाबेस का निर्माण नहीं किया जा सकता है। आपको इस मान को आपूर्ति करने के लिए कंटेनर को कॉन्फ़िगर करना होगा (एंटीलिब 5 + ओडीपी.नेट)

अब, एंटरप्राइज़ लाइब्रेरी, बनाम 2010, .NET 4.0 के ODP.NET Oracle.DataAccess 4.112.2.0 और संस्करण 5.0.414.0 का उपयोग करके माइग्रेट करें।

Oracle.DataAccess 4.112.2.0 EnterpriseLibrary 5.0.414.0

5.0 उद्यम लाइब्रेरी के लिए संस्करण 4.1 से हाल ही में उन्नयन के बाद, एक बार हम निम्न त्रुटि मिलती है:

"प्रकार डाटाबेस नहीं किया जा सकता बनाया गया। आपको इस मूल्य की आपूर्ति के लिए कंटेनर को कॉन्फ़िगर करना होगा। "

Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type Database, key "ConnectionStrings.Oracle.xxx" ---> Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "ConnectionStrings.Oracle.xxx". Exception occurred while: while resolving. Exception is: InvalidOperationException - The type Database cannot be constructed. You must configure the container to supply this value.

संदर्भ EntLib फोरम: http://entlib.codeplex.com/discussions/215290

इस बारे में कोई समाधान ??

मेरी config

<configSections> 

<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=709072f976b4c05b"/> 

<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=709072f976b4c05b" /> 
</configSections> 

<dataConfiguration defaultDatabase="ConnectionStrings.Oracle.xxx"/> 

<connectionStrings> 

<add name="ConnectionStrings.Oracle.xxx" connectionString="DATA SOURCE=des;PASSWORD=zzz;PERSIST SECURITY INFO=True;USER ID=aaa;" 
providerName="Oracle.DataAccess.Client" /> 

मेरे कोड

var key = "ConnectionStrings.Oracle.xxx"; 

      Database db = Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.Current.GetInstance<Database>(key); //~(EntLib 5 recommended) 


      using (DbCommand cm = db.GetStoredProcCommand("TBL_FRKDATA.TBL_FRKDATA_FND_ALL")) 
      { 
       cm.Parameters.Add(CreateCursorParameter("P_REFCURSOR")); 

       // Using "using" will cause both the DataReader and connection to be 
       // closed. (ExecuteReader will close the connection when the 
       // DataReader is closed.) 
       using (IDataReader dataReader = db.ExecuteReader(cm)) 
       { 
        while (dataReader.Read()) 
        { 
         builder.Add(dataReader); 
        } 
        return builder.EntityList; 

       } 
      } 

पूर्ण त्रुटि स्टैकट्रेस

Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.GuardTypeIsNonPrimitive(IBuilderContext context, SelectedConstructor selectedConstructor) Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp(IBuilderContext context) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlanCreatorPolicy.CreatePlan(IBuilderContext context, NamedTypeBuildKey buildKey) Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable 1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable 1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides) Microsoft.Practices.Unity.UnityServiceLocator.DoGetInstance(Type serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance[TService](String key)

अद्यतन

इस कोड को मेरे लिए काम करता है:

[TestMethod] 
    public void Conectar_con_EntLib_y_OdpNet_Test() 
    { 
     var key = "ConnectionStrings.Oracle.xxx"; 

     string connectionString = ConfigurationManager.ConnectionStrings[key].ConnectionString; 
     string providerName = ConfigurationManager.ConnectionStrings[key].ProviderName; 

     //Database db = Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.Current.GetInstance<Database>(key); 

     TestContext.WriteLine("connectionString: " + connectionString); 
     TestContext.WriteLine("providerName: " + providerName); 

     DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); 

     using (DbConnection connection = factory.CreateConnection()) 
     { 
      connection.ConnectionString = connectionString; 

      connection.Open(); 

      TestContext.WriteLine("Estado Conexión: " + connection.State); 
      connection.Close(); 
     } 



    } 

समाधान: रैंडी लेवी (http://entlib.codeplex.com/discussions/215290)

आप Oracle.DataAccess.Client प्रदाता के साथ उद्यम लाइब्रेरी OracleDatabase उपयोग नहीं कर सकते द्वारा। OracleDatabase में निर्मित को हार्डकोड किया गया है OracleClientFactory DbProviderFactory का उपयोग करें जबकि आप ODP.NET प्रदाता (Oracle.DataAccess.Client) का उपयोग करना चाहते हैं।

सबसे अच्छा तरीका EntLibContrib ओरेकल ओडीपी.NET डेटा प्रदाता काम करना है क्योंकि यह कॉन्फ़िगरेशन फ़ाइलों सहित आपको आवश्यक सभी चीज़ों का समर्थन करना चाहिए।

के बाद से ऐसा लगता है जैसे आप DbProviderFactory बना सकते हैं आप ODP.NET OracleClientFactory के साथ एक GenericDatabase उपयोग करने के लिए कोशिश कर सकते हैं, लेकिन मुझे लगता है कि (उदा refcursor) विशिष्ट ओरेकल कार्यक्षमता के लिए समस्या आ जाती हैं लगता होगा लग रहा है।

आप इसे सीधे इस्तेमाल कर सकते हैं:

string connectionString = ConfigurationManager.ConnectionStrings["Connection String"].ConnectionString; 
string providerName = ConfigurationManager.ConnectionStrings["Connection String"].ProviderName; 

DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); 
var db = new GenericDatabase(connectionString, factory); 
+0

त्वरित जांच [MSDN पोस्ट] (http://msdn.microsoft.com/en-us/library/ff953187 (v ​​= PandP.50) .aspx)। राज्यों 'हालांकि, ध्यान रखें कि ओरेकल क्लाइंट प्रदाता को .NET Framework के संस्करण 4.0 में बहिष्कृत किया गया है, हालांकि यह अभी भी एंटरप्राइज़ लाइब्रेरी द्वारा समर्थित है। भविष्य के विकास के लिए, एक अलग ओरेकल ड्राइवर चुनने पर विचार करें। –

+0

क्या आपने http://stackoverflow.com/questions/4030436/activation-error-occured-while-trying-to-get-instance-of-type-डेटा- कुंजी या http://stackoverflow.com/questions/2900403/activation-error-occured-while-trying-to-get-instance-of-type-logwriter –

+0

System.Data.OracleClient.dll .NET 4.0 में बहिष्कृत है। लेकिन ODP.NET (Oracle.DataAccess.dll) .NET 4.0 में समर्थित है। सवाल Oracle.DataAccess.dll 4.112.2.0 और EntLib 5.0 का उपयोग कर रहा है। – Kiquenet

उत्तर

2

Microsoft.Practices.EnterpriseLibrary.Common 
Microsoft.Practices.EnterpriseLibrary.Data 
Microsoft.Practices.ServiceLocation 

के लिए एक संदर्भ जोड़ें तो इस लाइन का उपयोग डेटाबेस पाने के लिए:

var database = EnterpriseLibraryContainer.Current.GetInstance<Database>(); 

अधिक यहाँ जानकारी: http://devstuffs.wordpress.com/2012/03/13/enterprise-library-5-with-odp-net/

0

मुझे एक ही समस्या थी और एप्लिकेशन पूल को बदलने के लिए "32 बिट एप्लिकेशन सक्षम करें" को सही करने का संकल्प था।

संबंधित मुद्दे

 संबंधित मुद्दे