7

私は ODP.NET と Enterprise Library のバージョン 4.1 を 2008 に対して使用しています。すべて問題ありません。

ここで、ODP.NET Oracle.DataAccess 4.112.2.0 および Enterprise Library のバージョン 5.0.414.0 を使用して移行します (2010 の .net 4.0 に対して)。

Oracle.DataAccess 4.112.2.0 EnterpriseLibrary 5.0.414.0

Enterprise Library のバージョン 4.1 から 5.0 への最近のアップグレードに続いて、次のエラーが表示されます。

「タイプ データベースを構築できません。この値を提供するようにコンテナを設定する必要があります。」

Microsoft.Practices.ServiceLocation.ActivationException: タイプ データベース、キー "ConnectionStrings.Oracle.xxx" のインスタンスを取得しようとしたときにアクティブ化エラーが発生しました ---> Microsoft.Practices.Unity.ResolutionFailedException: 依存関係の解決に失敗しました、type = "Microsoft .Practices.EnterpriseLibrary.Data.Database"、名前 = "ConnectionStrings.Oracle.xxx". 例外が発生しました: 解決中。例外: InvalidOperationException - タイプ Database を構築できません。この値を提供するようにコンテナーを構成する必要があります。

参照 EntLib フォーラム: 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 コンテキスト、SelectedConstructor selectedConstructor) Microsoft.Practices.ObjectBuilder2.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(Type t、オブジェクトの存在、文字列名、IEnumerable1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.Resolve(型 t、文字列名、ResolverOverride[] resolverOverrides) Microsoft.Practices.Unity.UnityServiceLocator.DoGetInstance(型 serviceType、文字列キー) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(タイプ serviceType、文字列キー) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(タイプ serviceType、文字列キー) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance[TService](文字列キー)

アップデート

このコードは私のために働きます:

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



    }

解決策: Randy Levy ( http://entlib.codeplex.com/discussions/215290 )

Enterprise Library OracleDatabase を Oracle.DataAccess.Client プロバイダーと一緒に使用することはできません。組み込みの OracleDatabase は、OracleClientFactory DbProviderFactory を使用するようにハードコーディングされていますが、ODP.NET プロバイダー (Oracle.DataAccess.Client) を使用する必要があります。

最善の方法は、EntLibContrib Oracle ODP.NET Data Provider を機能させることです。これは、構成ファイルを含め、必要なものすべてをサポートする必要があるためです。

DbProviderFactory を作成できるように見えるので、ODP.NET OracleClientFactory で GenericDatabase を使用することもできますが、特定の 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);
4

2 に答える 2

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/

于 2012-03-14T14:29:11.657 に答える