7

Tôi sử dụng ODP.NET và phiên bản 4.1 của Thư viện doanh nghiệp, so với 2008. Và tất cả đều OK.Cơ sở dữ liệu kiểu không thể được xây dựng. Bạn phải cấu hình container để cung cấp giá trị này (EntLib 5 + ODP.NET)

Bây giờ, di chuyển bằng ODP.NET Oracle.DataAccess 4.112.2.0 và phiên bản 5.0.414.0 của Thư viện doanh nghiệp, so với năm 2010, .net 4.0.

Oracle.DataAccess 4.112.2.0 EnterpriseLibrary 5.0.414.0

Sau một nâng cấp gần đây từ phiên bản 4,1-5,0 của Thư viện Enterprise, một khi chúng tôi nhận được lỗi sau:

"Cơ sở dữ liệu loại có thể không được Bạn phải định cấu hình vùng chứa để cung cấp giá trị này. "

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.

Tài liệu tham khảo EntLib Diễn đàn: http://entlib.codeplex.com/discussions/215290

bất kỳ giải pháp về nó ??

cấu hình của tôi

<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" /> 

Mã My

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; 

       } 
      } 

đầy đủ lỗi stacktrace

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)

CẬP NHẬT

mã này làm việc cho tôi:

[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(); 
     } 



    } 

Giải pháp: bởi Randy Levy (http://entlib.codeplex.com/discussions/215290)

Bạn không thể sử dụng Enterprise Library OracleDatabase với nhà cung cấp Oracle.DataAccess.Client. Việc xây dựng trong OracleDatabase được hardcoded để sử dụng OracleClientFactory DbProviderFactory trong khi bạn muốn sử dụng nhà cung cấp ODP.NET (Oracle.DataAccess.Client).

Cách tốt nhất là làm cho Nhà cung cấp dữ liệu Oracle ODP.NET của EntLibContrib làm việc vì nó sẽ hỗ trợ mọi thứ bạn cần bao gồm tệp cấu hình. Vì có vẻ như bạn có thể tạo DbProviderFactory, bạn có thể thử sử dụng GenericDatabase với ODP.NET OracleClientFactory nhưng tôi đoán rằng bạn sẽ gặp phải các vấn đề về chức năng Oracle cụ thể

Bạn có thể sử dụng nó trực tiếp:

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

Kiểm tra nhanh [MSDN Post] (http://msdn.microsoft.com/en-us/library/ff953187 (v ​​= PandP.50) .aspx). Tuy nhiên, hãy nhớ rằng nhà cung cấp OracleClient không được chấp nhận trong phiên bản 4.0 của .NET Framework, mặc dù nó vẫn được Thư viện Enterprise hỗ trợ. Để phát triển trong tương lai, hãy cân nhắc chọn một trình điều khiển Oracle khác.. –

+0

Bạn đã kiểm tra http://stackoverflow.com/questions/4030436/activation-error-occured-while-trying-to-get-instance-of-type-database- key hoặc http://stackoverflow.com/questions/2900403/activation-error-occured-while-trying-to-get-instance-of-type-logwriter –

+0

System.Data.OracleClient.dll không được chấp nhận trong .NET 4.0. Nhưng ODP.NET (Oracle.DataAccess.dll) được hỗ trợ trong .NET 4.0. Câu hỏi đặt ra là sử dụng Oracle.DataAccess.dll 4.112.2.0 và EntLib 5.0. – Kiquenet

Trả lời

2

Thêm một tham chiếu đến

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

sau đó sử dụng dòng này để có được những cơ sở dữ liệu:

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

Thông tin thêm ở đây: http://devstuffs.wordpress.com/2012/03/13/enterprise-library-5-with-odp-net/

0

Tôi đã có cùng một vấn đề và giải quyết việc thay đổi Application Pool "Enable 32 bit Applications" thành true.

Các vấn đề liên quan