ASP.NET调用Oracle分页存储过程并结合ASPnetpager分页控件 实现分页功能
之前用的是GridView自带的分页功能,那速度啊慢的真实不行 ,决定自定义分页 Oracle库里有5W多条数据
AspnetPager做的还是不错,拿过来用
Oracle 分页存储过程:
create or replace package JT_P_page is
type type_cur is ref cursor; --定义游标变量用于返回记录集
procedure Pagination (Pindex in number, --要显示的页数索引,从0开始
Psql in varchar2, --产生分页数据的查询语句
Psize in number, --每页显示记录数
Pcount out number, --返回的分页数
Prowcount out number, --返回的记录数
v_cur out type_cur --返回分页数据的游标
);
end JT_P_page;
--定义包主体
create or replace package body JT_P_page is
procedure Pagination(Pindex in number, --要显示的页数索引,从0开始
Psql in varchar2, --产生分页数据的查询语句
Psize in number, --每页显示记录数
Pcount out number, --返回的分页数
Prowcount out number, --返回的记录数
v_cur out type_cur --返回分页数据的游标
) AS
v_sql VARCHAR2(1000);
v_Pbegin number;
v_Pend number;
begin
v_sql := 'select count(*) from (' || Psql || ')';
execute immediate v_sql into Prowcount; --计算记录总数
Pcount := ceil(Prowcount / Psize); --计算分页总数
--显示任意页内容
v_Pend := Pindex * Psize + Psize;
v_Pbegin := v_Pend - Psize + 1;
v_sql := 'select * from (' || Psql || ') where rn between ' || v_Pbegin || ' and ' || v_Pend;
open v_cur for v_sql;
end Pagination;
end JT_P_page;
这个是在网上找的,还不错 主要是根据伪列 rownum作为where查询条件 进行帅选,关于rownum伪列可以查看
http://www.cnblogs.com/chinhr/archive/2007/09/30/911685.html 写的很透彻 ,通过这次做这个Oracle分页算是对rownum有了初步的认识,实践出真理 , 有了存储过程截下来就是调用
存储过程有6个参数 前三个是输入参数,后三个是输出参数
Help.cs:
public static DataTable ReturnDataTable(int index,string sql,int pageSize)
{
DataTable dt = new DataTable();
try
{
OracleParameter []param=new OracleParameter []{new OracleParameter("Pindex",OracleType.Number),new OracleParameter("Psql",OracleType.VarChar),new OracleParameter("Psize",OracleType.Number),new OracleParameter("Pcount",OracleType.Number),new OracleParameter("Prowcount",OracleType.Number),new OracleParameter("v_cur",OracleType.Cursor)};
param[0].Value = index;
param[1].Value = sql;
param[2].Value = pageSize;
param[0].Direction = ParameterDirection.Input;
param[1].Direction = ParameterDirection.Input;
param[2].Direction = ParameterDirection.Input;
param[3].Direction = ParameterDirection.Output;
param[4].Direction = ParameterDirection.Output;
param[5].Direction = ParameterDirection.Output;
dt= OracleHelper.ReturnDataTable(OracleHelper.dbCon, CommandType.StoredProcedure, "JT_P_page.Pagination", param);
Help._rowCount = int.Parse(param[4].Value.ToString());
}
catch (OracleException on)
{
throw on;
}
return dt;
}
注意一下再调用的时候 参数名必须和存储过程中的参数保持一致 否则可能会报错 例如:new OracleParameter("Pindex",OracleType.Number) 中的 Pindex 和存储过程procedure Pagination (Pindex in number 中的一样,Aspnetpage作为一个第三方控件,直接从网上下载后 在VS2005工具栏里把.dll导进去 就可以拿来用了 前台页面Update_Agent.aspx.cs里:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindGridView(0, "union_view", _pageSize);
AspNetPager1.RecordCount = (Help._rowCount >= 0) ? Help._rowCount : 0;
}
}
private void BindGridView(int index, string sql, int pageSize)
{
DataTable dt;
if (sql != "")
{
ViewState["IsProcedure"] = "yes";
dt = Help.ReturnDataTable(index, sql, pageSize);
}
else
{
ViewState["IsProcedure"] = "no";
dt = Help.ReturnDataTableByCondition(dateinput.Value, dateinput2.Value, orderID.Value.Trim(), dgWay.SelectedValue, AspNetPager1.CurrentPageIndex - 1, AspNetPager1.PageSize);
}
iagentView.DataSource = dt;
DataBind();
AspNetPager1.RecordCount = (sql!="")?Help._rowCount:Help.ReturnRows(dateinput.Value, dateinput2.Value, orderID.Value.Trim(), dgWay.SelectedValue);
AspNetPager1.PageSize = pageSize;
AspNetPager1.CustomInfoHTML = "记录总数:<font color=\"blue\"><b>" + AspNetPager1.RecordCount.ToString() + "</b></font>";
AspNetPager1.CustomInfoHTML += " 总页数:<font color=\"blue\"><b>" + AspNetPager1.PageCount.ToString() + "</b></font>";
AspNetPager1.CustomInfoHTML += " 当前页:<font color=\"red\"><b>" + AspNetPager1.CurrentPageIndex.ToString() + "</b></font>";
}
/// <summary>
/// AspNetPager1 PageChanged事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
if (ViewState["IsProcedure"] != null && ViewState["IsProcedure"].ToString() == "yes")
BindGridView(AspNetPager1.CurrentPageIndex-1, "union_view", _pageSize);
else
BindGridView(AspNetPager1.CurrentPageIndex - 1, "", _pageSize);
}
Update_Agent.aspx 里 AspNetPager 的申明 以及一些属性的设置 这个网上可以搜的倒
<webdiyer:AspNetPager ID="AspNetPager1" CssClass="pages" CurrentPageButtonClass="cpb" runat="server" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PrevPageText="上一页" AlwaysShow="true" PageIndexBoxType="DropDownList" OnPageChanged="AspNetPager1_PageChanged" ShowCustomInfoSection="left" NumericButtonTextFormatString="{0}" >
</webdiyer:AspNetPager>
我做了一下测试,用存储过程分页比原来GridView自带的分页效率提高了不止一倍 ,时间只有原来的一半不到