用.NET调用oracle的存储过程返回记录集

原创 2005年03月02日 16:32:00

文章出处:伟网动力(http://www.weiw.com)
有何见解,可以来此论坛 http://www.weiw.com/bbs/
转贴请标明出处,谢谢。
最近做一个项目,为了提高数据库安全性,客户要求所有数据库操作都要放在存储过程。象一般的更新操作,返回一个值的,都比较容易实现。而要想返回记录集就比较麻烦,我在网上搜了一下,这方面的文章并不多。在此总结一下,供大家参考。
有关.NET如何访问oracle数据库,在此就不介绍了。相关的资料也很多,有兴趣的朋友可以看下文。
使用ASP.NET访问Oracle数据库的方法
http://www.weiw.com/article/list.asp?id=649

oracle的存储过程返回记录集,关键之处是要用游标。
关于数据库的游标(cursor)大家肯定都接触不少,我们可以通过OPEN,FETCH,CLOSE操作控制游标进行各种方便的操作,这方面的例子我就不在重复了。我们现在要介绍的是游标变量(cursor variable)。类似游标,游标变量也是指向一个查询结果集的当前行。不同的是,游标变量能为任何类型相似(type-compatible)的查询打开,而并不是绑定到某一个特定的查询。通过游标变量,你可以在数据库的数据提取中获得更多的方便。

首先是建立表。

CREATE TABLE LIHUAN.BILL_POINTS
(
    POINTS_ID                      NUMBER(10,0) NOT NULL,
    CUSTOMER_ID                    NUMBER(10,0) NOT NULL,
    BILL_POINT_NO                  NUMBER(2,0) DEFAULT 1 NOT NULL,
    CONSTRAINT PK_BILL_POINTS PRIMARY KEY (POINTS_ID)
)
/

其次,建PACKAGE
CREATE OR REPLACE PACKAGE LIHUAN.YY_PKG_BILL_POINT_NO/*取得用户的所有计费电序号*/
IS
TYPE T_CURSOR IS REF CURSOR;

   PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
   Re_CURSOR OUT T_CURSOR);
END;
/

再次,建PACKAGE BODY
CREATE OR REPLACE PACKAGE BODY LIHUAN.YY_PKG_BILL_POINT_NO/*取得用户的所有计费电序号*/
IS

 PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
   Re_CURSOR OUT T_CURSOR)
   IS
   V_CURSOR T_CURSOR;
   BEGIN
      OPEN V_CURSOR FOR
            select Bill_Point_No from BILL_POINTS where CUSTOMER_ID =P_CUSTOMER_ID;
           Re_CURSOR := V_CURSOR;
   END;
END;
/

最后,在.NET中程序调用。
public DataSet Bill_Point_No(string CUSTOMER_ID)//ok
  {
   DataSet dataset = new DataSet();
   Hashtable HT=new Hashtable();
   HT.Add("P_CUSTOMER_ID",CUSTOMER_ID);
   if(RunProcedure("Re_CURSOR",OracleType.Cursor,ref dataset,HT,bmsOracleUser+".YY_PKG_BILL_POINT_NO.BILL_POINT_NO",bmsOracleConnectionString))
   {
    ;
   }
   else
   {
    dataset=null;
   }
   return dataset;
  }

public bool RunProcedure(string ReturnParameter,OracleType ParamType,ref DataSet Dataset,Hashtable HT ,string ProcedureName,string OracleConnection)
  { 
   System.Data.OracleClient.OracleConnection dsconnection = new System.Data.OracleClient.OracleConnection(OracleConnection);
   System.Data.OracleClient.OracleCommand dacommand = new System.Data.OracleClient.OracleCommand(ProcedureName,dsconnection);
   dsconnection.Open(); 
   dacommand.CommandType=CommandType.StoredProcedure;
   IDictionaryEnumerator Enumerator;
   Enumerator = HT.GetEnumerator();
   object Value=null;
   OracleParameter OracleParam;
   OracleParam = dacommand.Parameters.Add(new OracleParameter(ReturnParameter,ParamType));
   OracleParam.Direction = ParameterDirection.Output;
   while(Enumerator.MoveNext())
   {
    Value = Enumerator.Value;
    OracleParam=dacommand.Parameters.Add(new OracleParameter(Enumerator.Key.ToString(), Value));
   }
   OracleDataAdapter ODAdapter=new OracleDataAdapter(dacommand);
            try
   {
    ODAdapter.Fill(Dataset);
     return true;
   }
   catch(System.Exception e)
   {
    e.ToString();
    return false;
   }
   finally
   {  
    HT.Clear();
    dacommand.Parameters.Clear();
    dsconnection.Close();
   }
 }


C#调用ORACLE存储过程返回结果集及函数

ORACLE段: 首先在ORACLE建立PACKAGE和PACKAGE BODY,将在这里面定义函数和存储过程返回结果集。 1:建立PACKAGE: CREATE OR REPLAC...
  • zzy7075
  • zzy7075
  • 2015年02月27日 10:40
  • 1458

.net 调用Oracle存储过程

在.NET中调用Oracle9i存储过程经验总结(1)  在.NET中调用Oracle9i存储过程可以用多个数据提供者,比如OralceClient,OleDb。本文将用OralceClient为例。...
  • u010678947
  • u010678947
  • 2014年03月07日 12:38
  • 1567

oracle使用游标让存储过程返回记录集

因为项目需要,需要写一个存储过程在oracle上,返回的是记录集,普通的存储过程貌似不可以,按照网上说的用指针写了一个出来,如下: --声明包头 CREATE OR REPLACE PACKAGE P...
  • zdp0350543
  • zdp0350543
  • 2013年10月18日 10:20
  • 797

Mybatis 调用oracle存储过程返回结果集

1.这里我是直接接http://blog.csdn.net/shen525758203/article/details/32331229
  • SHEN525758203
  • SHEN525758203
  • 2014年06月20日 15:51
  • 3109

JAVA调用ORACLE的存储过程、函数的返回结果集

具体过程如下:CREATE TABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARY KEY, PRICE NUMBER(7,2), UPDATED...
  • paul50060049
  • paul50060049
  • 2017年05月11日 21:03
  • 280

VC++使用列表控件显示数据库中的数据(移动记录集指针遍历记录集)

1、创建一个基于对话框的MFC应用程序,命名为SeeData。 2、向资源视图中的主对话框中添加一个列表视图控件。ID默认。关联一个变量为m_grid。 3、在类视图中添加一个数据库连接类ADOC...
  • hushiwei1993
  • hushiwei1993
  • 2015年05月03日 09:11
  • 830

PostgreSQL存储过程返回数据集实例

这里用一个实例来演示PostgreSQL存储过程如何返回数据集. 1 首先准备数据表 //member_category create table member_category(id serial,...
  • wuyilun526
  • wuyilun526
  • 2015年01月16日 17:01
  • 1155

Java调用oracle存储过程通过游标返回临时表数据

项目开发过程中,不可避免的会用到存储过程返回结果集。特别是选择Oracle做为数据库时,就更麻烦了,因为Oracle存储过程和SQLServer的有点不太一样,直接返回不了结果集,那么怎么才能在使用O...
  • qq_36617521
  • qq_36617521
  • 2017年02月22日 09:53
  • 413

.net 返回前端json数据

1.需求 允许.net后端创建json数据,通过response.write()方式动态的回应ajax请求数据,并通过js动态的刷新到页面上。 2.实现方法 2.1前端ajax对于数据的请求和返...
  • cgl_zyw
  • cgl_zyw
  • 2017年06月10日 21:48
  • 492

asp rs记录集recordset常用操作代码 详细

几乎每一个ASP数据库程序都要用到recordset,关于recordset的很多用法您都知道吗?下面介绍了一些经常用到的ASP RS记录集操作,包括添加、更新、修改、删除数据库内容等,并对一些关键的...
  • fearlessxjdx
  • fearlessxjdx
  • 2016年12月05日 20:45
  • 2583
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用.NET调用oracle的存储过程返回记录集
举报原因:
原因补充:

(最多只允许输入30个字)