zoukankan      html  css  js  c++  java
  • 用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),就可以返回结果集,这时返回的结果集可以多个,问题得以解决!!!

    不知道高手们有什么其他的高见,请明示!
  • 相关阅读:
    [译]在Python中如何使用额enumerate 和 zip 来迭代两个列表和它们的index?
    [译]如何去除Git的unstaged的文件提示“old mode 100755 new mode 100644”?
    [译]在SQL查询中如何映射(替换)查询的结果?
    [总结]《敏捷软件开发: 原则、模式与实践》一次编程实践
    [书摘]《敏捷软件开发: 原则、模式与实践》第一部分:敏捷开发
    [译]Python
    [问题解决]Python locale error: unsupported locale setting
    [持续补充]开发过程中常见bug查找思路
    [译]如何比较同一分支上的不同commit的代码区别?
    [整理]如何切换到远程分支
  • 原文地址:https://www.cnblogs.com/weiweictgu/p/569014.html
Copyright © 2011-2022 走看看