关于这一点,有几个问题悬而未决,但没有一个得到真正的回答。
基本上,目前是否有针对enlib(6.0)的ODP.NET实现正在使用?还是我必须为ODP.NET编写一个映射/自定义DAO?
通用数据库只能让我走到目前为止,它与Oracle存储过程不兼容(可怕的"使用GenericDatabase的连接不支持参数发现。您必须显式指定参数,或将连接配置为使用从支持参数发现的数据库派生的类型"错误)
我知道entlibcontrib项目,但这似乎是搁置/死亡,因为自2011/entlib 5.0以来,它还没有一个新的realeasy。
任何关于entlib的自定义DAO开发的指针或建议都将不胜感激。
以下是我们对此的官方立场:
如果您使用的是Oracle数据库,则可以使用企业库中包含的Oracle提供程序和ADO.NET Oracle提供程序,这要求您引用或添加程序集System.Data.OracleClient.dll。但是,请记住,OracleClient提供程序在.NET Framework 4.0版本中已被弃用,并且在Enterprise Library 6中不赞成支持此提供程序。尽管Enterprise Library 6中仍然包含对OracleClient提供程序的支持,但为了将来的开发,您应该考虑选择使用不同Oracle驱动程序的数据库类的不同实现。
我还没有遇到针对EntLib6的ODP.NET实现。如果你最终更新了EntLibContrib v5.0上可用的版本,请将其发布到contrib网站,让其他人从中受益。应该相当简单,在v6中对DAAB没有重大更改。
我希望我能给你一个更好的答案,但归根结底,这取决于发布故事的优先级,而这一个故事还不够高,我的团队无法接受。
我们使用ODP.NET和企业库中的GenericDatabase对象成功连接到Oracle 11g。
我们在Oracle包中运行存储过程时遇到了一个问题(忘记确切的错误是什么,但在实际使用命令之前,我们遇到了一些问题),我们对企业库进行了一个小的更改来处理它。
在SprocAccessor.cs中,我们修改了
public override IEnumerable<TResult> Execute(params object[] parameterValues)
看起来像这个
public override IEnumerable<TResult> Execute(params object[] parameterValues)
{
using (DbCommand command = Database.GetStoredProcCommand(procedureName))
{
parameterMapper.AssignParameters(command, parameterValues);
//return base.Execute(command); Removed
//foreach added by ngpojne. This allows the command to be used before it is disposed of.
foreach (TResult result in base.Execute(command))
{
yield return result;
}
}
}