ASP.NET调用oracle存储过程实现快速分页(转)

简介:


推荐: 使用 ADO.NET 访问 Oracle 9i 存储过程的介绍
http://www.microsoft.com/china/MSDN/library/data/dataAccess/DMSDNorsps.mspx

ASP.NET调用oracle存储过程实现快速分页的步骤如下:

Oracle 9i 包定义:

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;

Oracle 9i 包主体:
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中调用的代码:

///   <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)
{
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];
}
v



本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2008/03/03/1088348.html,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 SQL Oracle
Oracle系列十五:存储过程
Oracle系列十五:存储过程
|
3月前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
41 4
|
18天前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(上)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
4月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
39 0
|
18天前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(下)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
24天前
|
存储 SQL Oracle
Oracle存储过程与自定义函数的调用:异同与实战场景
【4月更文挑战第19天】Oracle的存储过程与自定义函数各有特色,存储过程用于封装复杂SQL操作,常在批量处理和数据维护中使用,通过CALL或EXECUTE调用;而自定义函数则用于简单计算和查询,返回单一值,可直接在SQL语句中调用。了解两者异同,如返回值方式、调用方式和应用场景,能提升数据库管理效率。实战场景包括:使用存储过程定期清理过期数据,用自定义函数在查询中动态计算字段值。
|
24天前
|
存储 SQL Oracle
Oracle存储过程:数据王国的魔法师
【4月更文挑战第19天】Oracle存储过程是封装复杂SQL操作的魔法工具,存储在数据库中以便重复调用。它们提供高效执行和安全,类似于预编译的程序。创建存储过程涉及定义名称和参数,如示例所示,创建一个根据员工ID获取姓名和薪资的`get_employee_info`过程。调用存储过程可提高代码可读性和性能,使数据库管理更为便捷。
|
25天前
|
SQL Oracle 关系型数据库
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
|
4月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
36 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
47 0