用Enterprise Library January 2006 的Data Access Application Block 访问Oracle存储过程心得

在.NET中访问Oracle的方式有很多,配置成ODBC、OLEDB、OracleClient,当然配置成OracleClient是最高效的,还有一种方式是通过Enterprise Library 来访问,EL使用反射原理,最后还是用的OracleClient。
        用OracleClient访问Oracle存储比较简单,原因很简单:System.Data.OracleClient 中所有方法都是专门对于Oracle来写的,充分体现了Oracle的特点,使用起来非常简单,在MSDN中有比较详细的例子。
        在大量最佳实践的基础上,微软社区上出现了Enterprise Library这个东东,它在.NET的各个数据访问提供程序基础上用类工厂的原理进行动态组装,可以使程序动态配置而不用编译源代码。
        DAAB在SQL Server上使用起来相当方便,但是用在Oracle上有些技巧,这是Oracle和SQL Server有些不同点造成的,在Oracle中过程返回一个结果集的时候与SQL Server做法有很多的不同,我的上一篇文章说明这点。
        1、创建一下过程:
读取信息

2、执行一下C#代码就可以将SP中的结果集返回
1DbCommand dbCmd = db.GetStoredProcCommand("pkgENTLIB_slope.ENTLIB_slope");
2return db.ExecuteDataSet(dbCmd);
说明:以上SP代码若是将"cur_OUT"改成其他的C#代码执行报错,为什么?
看看EL中的源代码你就会清楚:
Executes a command and returns the results in a new
PrepareCWRefCursor
QueryProcedureNeedsCursorParameter

EL将cur_OUT写死在代码中了,判断SP中是否有Cursor类型的参数,有则对其赋值,本人写的代码刚好与之吻合(此处的吻合不是碰巧的!! ^_^),而且刚好只有一个Cursor类型的,所以运行通过了。
写死带来一个问题,若是要一次查询返回多个结果集,一个cur_OUT肯定解决不了问题的,此时得退一步要将DbCommand换成OracleCommand就可以解决问题了,OracleCommand对象的Parameters可以用Add添加 OracleType.Cursor类型的参数到存储过程中,再用DataBase.ExecuteDataSet(OracleCommand),就可以返回结果集,这时返回的结果集可以多个,问题得以解决!!!

不知道高手们有什么其他的高见,请明示!
原文地址:https://www.cnblogs.com/weiweictgu/p/569014.html