用于存储过程分页的控件
2007-08-06 10:24
399 查看
对于少量的数据,我们可以用GridView的自带分页功能,而如果数据量大了,这种方式就显得有些笨拙了,在网上查了查,发现很多高手都用分页的存储过程来对数据进行按需查询。有前辈把存储过程写成了通用的,我弄了几个这种通用存储过程试了试,就是用不对啊。最后就想自己写个吧,些是写出来了,可毕竟自己功力不够啊,写出的存储过程有很多局限性,例如:只能针对单表,表的主键类型不同的话还要修改一下存储过程才可用。不过我自己用,有时候还是可以减轻一些工作了。
现在面临的问题是,在UI层如何来调用呢,我们要根据用户的操作来确定应该查询哪些记录,于是根据我的需求,写了个自定义控件来实现这个功能(也许我的工作是画蛇添足了,或许有其他更好的分页方?)。首先写了一个符合控件(就是显示“上页、下页”的哪些东西了),来改变和记录用户选择的页数,另外写了一个继承自ObjectDataSource的控件。两个控件协同工作,完成分页功能。
下面贴出代码:
一、SQLServer部分
分页存储过程如下:
IF EXISTS((SELECT NAME FROM SYSOBJECTS WHERE NAME='SingleTableCommonPager'AND TYPE='P'))
DROP PROCEDURE SingleTableCommonPager
GO
set QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE SingleTableCommonPager
@TableName VARCHAR(255), --表名
@PrimaryKey VARCHAR(255), --表的主键
@Condition VARCHAR(2000)=NULL, --查询条件
@OrderBy VARCHAR(500)=NULL, --排序方式
@GroupBy VARCHAR(255)=NULL, --分组
@PageIndex INT=0, --当前页
@PageSize INT=5, --页大小
@PageCount INT OUTPUT, --页数
@TotalRecords INT OUTPUT --总记录数
AS
BEGIN
set nocount on
-- Set the page bounds
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageSize - 1 + @PageLowerBound
-- Create a temp table TO store the select results
--DECLARE @CreateTempTable VARCHAR(500)
--SET @CreateTempTable='CREATE TABLE #PageIndex(IndexId int IDENTITY (0, 1) NOT NULL,'++')'
CREATE TABLE #PageIndex
(
IndexId int IDENTITY (0, 1) NOT NULL,
UniqueId uniqueidentifier
)
--
DECLARE @Select VARCHAR(5000)
SET @Select='INSERT INTO #PageIndex(UniqueId)SELECT '+@PrimaryKey
IF(@Condition IS NOT NULL)SET @Select=@Select+' WHERE '+@Condition
SET @Select=@Select+' FROM '+@TableName
IF(@OrderBy IS NOT NULL)SET @Select=@Select+' ORDER BY '+@OrderBy
IF(@GroupBy IS NOT NULL)SET @Select=@Select+' GROUP BY '+@GroupBy
-- Insert into our temp table
EXEC(@Select)
--Set total record count and page size
SET @TotalRecords=@@ROWCOUNT
SET @PageCount=@TotalRecords/@PageSize
IF(@TotalRecords%@PageSize<>0)
SET @PageCount=@PageCount+1
--select result
DECLARE @Sel VARCHAR(500)
SET @Sel='SELECT t.*'+' FROM #PageIndex p,'+@TableName+' t WHERE p.UniqueId=t.'+@PrimaryKey+
' AND p.IndexId >= '+cast(@PageLowerBound as varchar) +' AND p.IndexId <=' + cast(@PageUpperBound as varchar)
set nocount off
EXEC(@Sel)
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
我的表是这样的:
--CREATE DATABASE ZrkjDb
GO
USE ZrkjDb
GO
--===============================
--===============================
IF(NOT EXISTS(SELECT NAME,TYPE FROM SYSOBJECTS WHERE NAME='ZRCase' AND TYPE='U'))
BEGIN
CREATE TABLE ZRCase
(
CaseId UNIQUEIDENTIFIER DEFAULT(NEWID()) PRIMARY KEY,
CaseTitle NVARCHAR(100) NOT NULL, --案例名称
CaseSite NVARCHAR(100), --案例网址
CaseBreviaryImage NVARCHAR(200), --案例缩略图
CaseOriginalImage NVARCHAR(200), --案例原图
CaseDescription TEXT, --案例描述
ShowInMainPage BIT DEFAULT(0), --是否显示在首页
CaseOrder INT DEFAULT(0), --排序的顺序,针对首页显示的案例,数字越大,显示越前
AddDate SMALLDATETIME DEFAULT(GETDATE()) --添加时间
)
END
获取记录的存储过程:
--===============================
--===============================
IF(EXISTS(SELECT NAME FROM SYSOBJECTS WHERE NAME='P_ZRCase_Get' AND TYPE='P'))
DROP PROCEDURE P_ZRCase_Get
GO
CREATE PROCEDURE P_ZRCase_Get
@Index INT=0, --当前页
@Size INT=10, --页大小
@Count INT OUTPUT, --页数
@Total INT OUTPUT --总记录数
AS
BEGIN
EXEC SingleTableCommonPager
@TableName='ZRCase', --表名
@PrimaryKey='CaseId', --表的主键
@Condition=NULL, --查询条件
@OrderBy='AddDate desc', --排序方式
@GroupBy=NULL, --分组
@PageIndex=@Index, --当前页
@PageSize=@Size, --页大小
@PageCount=@Count out, --页数
@TotalRecords=@Total out --总记录数
END
GO
二、自定义控件代码:
分页控件(Pager.cs):
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Zrkj.WebControl
数据源控件(PagedObjectDataSource)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Zrkj.WebControl
三、前台调用代码:
Default.aspx:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="PagedObjectDataSource1">
<Columns>
<asp:BoundField DataField="CaseTitle" HeaderText="CaseTitle" SortExpression="CaseTitle" />
<asp:BoundField DataField="CaseOrder" HeaderText="CaseOrder" SortExpression="CaseOrder" />
<asp:CheckBoxField DataField="ShowInMainPage" HeaderText="ShowInMainPage" SortExpression="ShowInMainPage" />
<asp:BoundField DataField="CaseSite" HeaderText="CaseSite" SortExpression="CaseSite" />
</Columns>
</asp:GridView>
<cc1:Pager ID="Pager1" runat="server" OnCommand="Pager1_Command" Size="8" />
<cc1:PagedObjectDataSource ID="PagedObjectDataSource1" runat="server" PagerControl="Pager1" SelectMethod="GetCases" TypeName="Zrkj.WebDataProxy.CaseDataProxy">
<SelectParameters>
<asp:Parameter Name="Index" Type="Int32" />
<asp:Parameter Name="Size" Type="Int32" />
<asp:Parameter Direction="Output" Name="Count" Type="Int32" />
<asp:Parameter Direction="Output" Name="Total" Type="Int32" />
</SelectParameters>
</cc1:PagedObjectDataSource>
</form>
</body>
</html>
Default.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Zrkj.WebDataProxy;
using Zrkj.Model;
public partial class tst_Default : System.Web.UI.Page
至此,分页功能基本实现。
如果哪位仁兄在网上无意之中看到这篇文章,请勿见笑。
初学者,战战兢兢!
现在面临的问题是,在UI层如何来调用呢,我们要根据用户的操作来确定应该查询哪些记录,于是根据我的需求,写了个自定义控件来实现这个功能(也许我的工作是画蛇添足了,或许有其他更好的分页方?)。首先写了一个符合控件(就是显示“上页、下页”的哪些东西了),来改变和记录用户选择的页数,另外写了一个继承自ObjectDataSource的控件。两个控件协同工作,完成分页功能。
下面贴出代码:
一、SQLServer部分
分页存储过程如下:
IF EXISTS((SELECT NAME FROM SYSOBJECTS WHERE NAME='SingleTableCommonPager'AND TYPE='P'))
DROP PROCEDURE SingleTableCommonPager
GO
set QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE SingleTableCommonPager
@TableName VARCHAR(255), --表名
@PrimaryKey VARCHAR(255), --表的主键
@Condition VARCHAR(2000)=NULL, --查询条件
@OrderBy VARCHAR(500)=NULL, --排序方式
@GroupBy VARCHAR(255)=NULL, --分组
@PageIndex INT=0, --当前页
@PageSize INT=5, --页大小
@PageCount INT OUTPUT, --页数
@TotalRecords INT OUTPUT --总记录数
AS
BEGIN
set nocount on
-- Set the page bounds
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageSize - 1 + @PageLowerBound
-- Create a temp table TO store the select results
--DECLARE @CreateTempTable VARCHAR(500)
--SET @CreateTempTable='CREATE TABLE #PageIndex(IndexId int IDENTITY (0, 1) NOT NULL,'++')'
CREATE TABLE #PageIndex
(
IndexId int IDENTITY (0, 1) NOT NULL,
UniqueId uniqueidentifier
)
--
DECLARE @Select VARCHAR(5000)
SET @Select='INSERT INTO #PageIndex(UniqueId)SELECT '+@PrimaryKey
IF(@Condition IS NOT NULL)SET @Select=@Select+' WHERE '+@Condition
SET @Select=@Select+' FROM '+@TableName
IF(@OrderBy IS NOT NULL)SET @Select=@Select+' ORDER BY '+@OrderBy
IF(@GroupBy IS NOT NULL)SET @Select=@Select+' GROUP BY '+@GroupBy
-- Insert into our temp table
EXEC(@Select)
--Set total record count and page size
SET @TotalRecords=@@ROWCOUNT
SET @PageCount=@TotalRecords/@PageSize
IF(@TotalRecords%@PageSize<>0)
SET @PageCount=@PageCount+1
--select result
DECLARE @Sel VARCHAR(500)
SET @Sel='SELECT t.*'+' FROM #PageIndex p,'+@TableName+' t WHERE p.UniqueId=t.'+@PrimaryKey+
' AND p.IndexId >= '+cast(@PageLowerBound as varchar) +' AND p.IndexId <=' + cast(@PageUpperBound as varchar)
set nocount off
EXEC(@Sel)
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
我的表是这样的:
--CREATE DATABASE ZrkjDb
GO
USE ZrkjDb
GO
--===============================
--===============================
IF(NOT EXISTS(SELECT NAME,TYPE FROM SYSOBJECTS WHERE NAME='ZRCase' AND TYPE='U'))
BEGIN
CREATE TABLE ZRCase
(
CaseId UNIQUEIDENTIFIER DEFAULT(NEWID()) PRIMARY KEY,
CaseTitle NVARCHAR(100) NOT NULL, --案例名称
CaseSite NVARCHAR(100), --案例网址
CaseBreviaryImage NVARCHAR(200), --案例缩略图
CaseOriginalImage NVARCHAR(200), --案例原图
CaseDescription TEXT, --案例描述
ShowInMainPage BIT DEFAULT(0), --是否显示在首页
CaseOrder INT DEFAULT(0), --排序的顺序,针对首页显示的案例,数字越大,显示越前
AddDate SMALLDATETIME DEFAULT(GETDATE()) --添加时间
)
END
获取记录的存储过程:
--===============================
--===============================
IF(EXISTS(SELECT NAME FROM SYSOBJECTS WHERE NAME='P_ZRCase_Get' AND TYPE='P'))
DROP PROCEDURE P_ZRCase_Get
GO
CREATE PROCEDURE P_ZRCase_Get
@Index INT=0, --当前页
@Size INT=10, --页大小
@Count INT OUTPUT, --页数
@Total INT OUTPUT --总记录数
AS
BEGIN
EXEC SingleTableCommonPager
@TableName='ZRCase', --表名
@PrimaryKey='CaseId', --表的主键
@Condition=NULL, --查询条件
@OrderBy='AddDate desc', --排序方式
@GroupBy=NULL, --分组
@PageIndex=@Index, --当前页
@PageSize=@Size, --页大小
@PageCount=@Count out, --页数
@TotalRecords=@Total out --总记录数
END
GO
二、自定义控件代码:
分页控件(Pager.cs):
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Zrkj.WebControl
数据源控件(PagedObjectDataSource)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Zrkj.WebControl
三、前台调用代码:
Default.aspx:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="PagedObjectDataSource1">
<Columns>
<asp:BoundField DataField="CaseTitle" HeaderText="CaseTitle" SortExpression="CaseTitle" />
<asp:BoundField DataField="CaseOrder" HeaderText="CaseOrder" SortExpression="CaseOrder" />
<asp:CheckBoxField DataField="ShowInMainPage" HeaderText="ShowInMainPage" SortExpression="ShowInMainPage" />
<asp:BoundField DataField="CaseSite" HeaderText="CaseSite" SortExpression="CaseSite" />
</Columns>
</asp:GridView>
<cc1:Pager ID="Pager1" runat="server" OnCommand="Pager1_Command" Size="8" />
<cc1:PagedObjectDataSource ID="PagedObjectDataSource1" runat="server" PagerControl="Pager1" SelectMethod="GetCases" TypeName="Zrkj.WebDataProxy.CaseDataProxy">
<SelectParameters>
<asp:Parameter Name="Index" Type="Int32" />
<asp:Parameter Name="Size" Type="Int32" />
<asp:Parameter Direction="Output" Name="Count" Type="Int32" />
<asp:Parameter Direction="Output" Name="Total" Type="Int32" />
</SelectParameters>
</cc1:PagedObjectDataSource>
</form>
</body>
</html>
Default.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Zrkj.WebDataProxy;
using Zrkj.Model;
public partial class tst_Default : System.Web.UI.Page
至此,分页功能基本实现。
如果哪位仁兄在网上无意之中看到这篇文章,请勿见笑。
初学者,战战兢兢!
相关文章推荐
- asp.net 分页控件与执行分页的存储过程
- 菜鸟兵团原创作品展示平台 -- AspNetPager分页控件存储过程生成器
- sql分页存储过程!与asp.net分页控件一起使用
- ASP.NET分页存储过程自定义用户控件
- ASP.NET调用Oracle分页存储过程并结合ASPnetpager分页控件 实现分页功能
- 在网上找到的sql2000/2005/oracle分页控件存储过程,记下以备后用
- AspNetPager控件分页(使用控件自动生成的存储过程)
- asp.net的DataGrid分页控件,在Oracle数据库下,每次只取当前页的数据,不使用存储过程。
- 使用AspNetPager分页控件、分页存储过程及用户控件基类实现的完美分页功能
- ASP.NET分页存储过程自定义用户控件
- Delphi 数据分页显示(存储过程及ado控件)
- 使用AspNetPager分页控件、分页存储过程及用户控件基类实现的完美分页功能
- KMCT分页控件与存储过程分页完美结合---存储过程分页篇
- 用于分页的存储过程
- AspNetPager分页控件 存储过程
- 分页控件和分页存储过程结合使用
- 分页控件存储过程
- 1 用存储过程实现分页,除了上一页,下一页,第一页,和末页外还要有go按钮,以及go到那里的文本框。另外还要在Lable显示“当前x页,一共y页”。注意验证控件的使用和 链接存储过程的内容。
- ASP.NET分页存储过程自定义用户控件