当前位置: 首页 > 图文教程 > 数据库 > Oracle > ASP.NET调用oracle存储过程实现快速分页

Oracle
Oracle常用dump命令,记录一下备查。
Oracle存储过程之数据库中获取数据实例
Oracle存储过程入门学习基本语法
java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input
Oracle 函数大全[字符串函数,数学函数,日期函数]
Oracle 自增(auto increment) 或 标识字段的建立方法
oracle 存储过程加密的方法
Oracle针对数据库某一行进行操作的时候,如何将这一行加行锁
Oracle 忘记密码的找回方法
Oracle 数据库导出(exp)导入(imp)说明
oracle 常见等待事件及处理方法
Oracle9i 动态SGA,PGA特性探索
PDO取Oracle lob大字段,当数据量太大无法取出的问题的解决办法
ORACLE 数据库RMAN备份恢复
用Mimer Validator检查SQL查询
oracle执行cmd的实现方法
ORACLE 正则解决初使化数据格式不一致
Oracle 触发器的使用小结
oracle 时间格式的调整
Oracle 10g的DBA无法登录解决方案

Oracle 中的 ASP.NET调用oracle存储过程实现快速分页


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 65 ::
收藏到网摘: n/a

  在WEB开发中,分页是我们必须要解决的一个问题,今天我们一起来看看ASP.NET调用ORACEL存储过程实现分页的方法。

  包定义:

  create or replace package MaterialManage is
  TYPE T_CURSOR IS REF CURSOR;
  Procedure Per_QuickPage
  (
  TbName in varchar2, --表名
  FieldStr in varchar2, --字段集
  RowFilter in varchar2, --过滤条件
  SortStr in varchar2, --排序集
  RownumFieldStr in varchar2, --分页条件
  TotalCount out number, --总记录数
  Cur_ReturnCur out T_CURSOR --返回的游标
  );
  end MaterialManage;

  包主体:

  create or replace package body MaterialManage is
  Procedure Per_QuickPage
  (
  TbName in varchar2, --表 名
  FieldStr in varchar2, --字段集
  RowFilter in varchar2, --过滤条件
  SortStr in varchar2, --排序集
  MinRowNum in number, --分页小值
  MaxRowNum in number, --分页大值
  TotalCount out number, --总记录数
  Cur_ReturnCur out T_CURSOR
  )
  is
  v_SourceTb1 varchar2(3000); --动态表名1
  v_SourceTb2 varchar2(3000); --动态表名2
  v_SourceTb3 varchar2(3000); --动态表名3
  v_SourceTb4 varchar2(3000); --动态表名4
  v_TotalCount varchar2(50); --总记录数
  v_sql varchar2(3000); --动态sql
  begin
  v_SourceTb1 := ’’’’(select ’’’’|| FieldStr ||’’’’ from ’’’’|| TbName ||’’’’) SourceTb1’’’’;
  v_SourceTb2 := ’’’’(select * from ’’’’|| v_SourceTb1 ||’’’’ where ’’’’|| RowFilter ||’’’’ ’’’’|| SortStr ||’’’’) SourceTb2’’’’;
  v_SourceTb3 := ’’’’(select rownum as Rowindex,SourceTb2.* from ’’’’|| v_SourceTb2 ||’’’’ where rownum<=’’’’|| MaxRowNum ||’’’’) SourceTb3’’’’;
  v_SourceTb4 := ’’’’(select * from ’’’’|| v_SourceTb1 ||’’’’ where ’’’’|| RowFilter ||’’’’) SourceTb4’’’’;
  v_sql := ’’’’select count(*) as TotalCount from ’’’’|| v_SourceTb4;
  execute immediate v_sql into v_TotalCount;
  TotalCount := v_TotalCount;
  v_sql := ’’’’select * from ’’’’|| v_SourceTb3 ||’’’’ where RowIndex >=’’’’||MinRowNum;
  open Cur_ReturnCur for v_sql;
  end Per_QuickPage;
  END MaterialManage;


  由于oracle有个rownum特性,所以分页的时候就是利用rownum来实现。如果大家还有什么更好的办法记得告诉我一声,多谢了,因为我测试了上面的分页方法效率并不是很高。

  存储过程返回了两个参数:TotalCount :当前条件下的总记录数 Cur_ReturnCur :游标类型,就是所要读取的记录的集合

  下面是ASP.NET中调用的代码:


this.style.display=’none’; Codehighlighter1_2319_2685_Open_Text.style.display=’none’; Codehighlighter1_2319_2685_Closed_Image.style.display=’inline’; Codehighlighter1_2319_2685_Closed_Text.style.display=’inline’; 
}" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />{ 
this.style.display=’none’; Codehighlighter1_2319_2685_Closed_Text.style.display=’none’; Codehighlighter1_2319_2685_Open_Image.style.display=’inline’; Codehighlighter1_2319_2685_Open_Text.style.display=’inline’; 
}" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" />/**//// <summary> 
/// 调用存储过程实现快速分页 
/// </summary> 
/// <param name="TbName">表名称</param> 
/// <param name="FieldStr">字段名称</param> 
/// <param name="RowFilter">过滤条件</param> 
/// <param name="SortStr">排序字段</param> 
/// <param name="MinPageNum">分页小值</param> 
/// <param name="MaxPageNum">分页大值</param> 
/// <param name="TotalCount">总记录(需要返回)</param> 
/// <returns>DataTable</returns> 
public DataTable QuickPage(string TbName,string FieldStr,string RowFilter,string SortStr,int MinRowNum,int MaxRowNum,ref int RecordCount) 

this.style.display=’none’; Codehighlighter1_2824_4736_Open_Text.style.display=’none’; Codehighlighter1_2824_4736_Closed_Image.style.display=’inline’; Codehighlighter1_2824_4736_Closed_Text.style.display=’inline’; 
}" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />{ 
this.style.display=’none’; Codehighlighter1_2824_4736_Closed_Text.style.display=’none’; Codehighlighter1_2824_4736_Open_Image.style.display=’inline’; Codehighlighter1_2824_4736_Open_Text.style.display=’inline’; 
}" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" />{ 
 OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["OracleConnstr"].ToString());
OracleCommand cmd  = new OracleCommand(); 
 cmd.Connection   = conn; 
 cmd.CommandText   = "MaterialManage.Per_QuickPage"; 
 cmd.CommandType   = CommandType.StoredProcedure; 
 cmd.Parameters.Add("TbName",OracleType.VarChar,50);    //表  名 
 cmd.Parameters["TbName"].Direction = ParameterDirection.Input; 
 cmd.Parameters["TbName"].Value     = TbName; 
 cmd.Parameters.Add("FieldStr",OracleType.VarChar,3000);   //字段集 
 cmd.Parameters["FieldStr"].Direction = ParameterDirection.Input; 
 cmd.Parameters["FieldStr"].Value     = FieldStr; 
 cmd.Parameters.Add("RowFilter",OracleType.VarChar,3000);  //过滤条件 
 cmd.Parameters["RowFilter"].Direction = ParameterDirection.Input; 
 cmd.Parameters["RowFilter"].Value     = RowFilter; 
 cmd.Parameters.Add("SortStr",OracleType.VarChar,3000);   //排序字段 
 cmd.Parameters["SortStr"].Direction = ParameterDirection.Input; 
 cmd.Parameters["SortStr"].Value     = SortStr; 
 cmd.Parameters.Add("MinRowNum",OracleType.Number);    //分页小值 
 cmd.Parameters["MinRowNum"].Direction = ParameterDirection.Input; 
 cmd.Parameters["MinRowNum"].Value     = MinRowNum; 
 cmd.Parameters.Add("MaxRowNum",OracleType.Number);    //分页大值 
 cmd.Parameters["MaxRowNum"].Direction = ParameterDirection.Input; 
 cmd.Parameters["MaxRowNum"].Value     = MaxRowNum; 
 cmd.Parameters.Add("TotalCount",OracleType.Number);    //页总记录数 
 cmd.Parameters["TotalCount"].Direction = ParameterDirection.Output; 
 cmd.Parameters["TotalCount"].Value     = 0; 
 cmd.Parameters.Add("Cur_ReturnCur",OracleType.Cursor);   //返回的游标 
 cmd.Parameters["Cur_ReturnCur"].Direction = ParameterDirection.Output; 
 DataSet Ds = new DataSet(); 
 OracleDataAdapter adapter= new OracleDataAdapter(cmd); 
 adapter.Fill(Ds); 
 conn.Close(); 
 //总记录数 
 RecordCount  = int.Parse(cmd.Parameters["TotalCount"].Value.ToString()); 
return Ds.Tables[0]; 
}