Тип базы данных не может быть построен. Необходимо настроить контейнер для предоставления этого значения (EntLib 5 + ODP.NET) - PullRequest
7 голосов
/ 13 января 2012

Я использую ODP.NET и версию 4.1 Корпоративной библиотеки против 2008. И все в порядке.

Теперь выполните миграцию с использованием ODP.NET Oracle.DataAccess 4.112.2.0 и версии 5.0.414.0 изКорпоративная библиотека, версия 2010, .net 4.0.

Oracle.DataAccess 4.112.2.0 EnterpriseLibrary 5.0.414.0

После недавнего обновления с версии 4.1 до 5.0 Корпоративной библиотеки, как только мы получимследующая ошибка:

"Невозможно создать базу данных типа. Необходимо указать контейнер для предоставления этого значения."

Microsoft.Practices.ServiceLocation.ActivationException: при активации произошла ошибка активациичтобы получить экземпляр типа базы данных, ключ «ConnectionStrings.Oracle.xxx» ---> Microsoft.Practices.Unity.ResolutionFailedException: сбой разрешения зависимости, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "ConnectionStrings.Oracle.xxx».Исключение произошло во время: при разрешении.Исключение: InvalidOperationException - Тип База данных не может быть построена.Вы должны настроить контейнер для предоставления этого значения.

Ссылки EntLib Forum: http://entlib.codeplex.com/discussions/215290

любое решение по этому поводу ??

моя конфигурация

<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, SelectedConstructorOject.Bject выбранный объект. Constructor.DynamicMethodConstructorStrategy.PreBuildUp (IBuilderContext контекст) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (IBuilderContext контекст) Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlanCreatorPolicy.CreatePlan (IBuilderContext контекст, NamedTypeBuildKey buildKey) Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (IBuilderContext контекст) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (контекст IBuilderContext) Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Тип t, Объект существует, Строка name, IEnumerable 1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable 1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.Resolve (Тип t, Имя строки, ResolverOverride [] resolverOverrides)ServiceLocation.ServiceLocatorImplBase.GetInstance (Тип serviceType, ключ строки) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (Тип serviceType, ключ строки)

ОБНОВЛЕНИЕ

этот код работает для меня:

    [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)

Вы не можете использовать OracleDatabase Enterprise Library споставщик Oracle.DataAccess.Client.Встроенная OracleDatabase жестко запрограммирована для использования OracleClientFactory DbProviderFactory, тогда как вы хотите использовать провайдера ODP.NET (Oracle.DataAccess.Client).

Лучший способ - заставить работающий провайдер данных ODP.NET Oracle EntLibContrib.поскольку он должен поддерживать все, что вам нужно, включая файлы конфигурации.

Поскольку похоже, что вы можете создать DbProviderFactory, вы можете попробовать использовать GenericDatabase с ODP.NET OracleClientFactory, но я предполагаю, что у вас возникнут проблемыдля определенных функций Oracle (например, 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);

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Добавить ссылку на

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 голосов
/ 28 февраля 2017

У меня возникла та же проблема, и я решил изменить пул приложений "Включить 32-битные приложения" на true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...