您的位置:首页 > 其它

用于存储过程分页的控件

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

至此,分页功能基本实现。

如果哪位仁兄在网上无意之中看到这篇文章,请勿见笑。
初学者,战战兢兢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: