私は 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、オブジェクトの存在、文字列名、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) 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);