B/S模式分页

SqlServer数据库准备工作:
(1)创建一张表Students,字段有Id,Name,Sex,Phone

CREATE TABLE Students(
Id INT IDENTITY(1,1),
Name VARCHAR(20),
Sex BIT,
Phone VARCHAR(11)
)

(2)添加数据

INSERT INTO Students(name,sex,phone) VALUES(‘小明’,0,‘13111111111’)
INSERT INTO Students(name,sex,phone) VALUES(‘小华’,1,‘13222222222’)
INSERT INTO Students(name,sex,phone) VALUES(‘小张’,0,‘13333333333’)
INSERT INTO Students(name,sex,phone) VALUES(‘小李’,1,‘13444444444’)
INSERT INTO Students(name,sex,phone) VALUES(‘小玉’,1,‘13555555555’)
INSERT INTO Students(name,sex,phone) VALUES(‘贝贝’,1,‘13666666666’)
INSERT INTO Students(name,sex,phone) VALUES(‘花花’,1,‘13777777777’)
INSERT INTO Students(name,sex,phone) VALUES(‘小杨’,0,‘13888888888’)
(3)创建存储过程spPage,存储过程返回结果集和总记录数。sqlServer没有limit,实际上是使用ID作为分页的标识,所以必须保证ID的连续才能正常分页。也可以使用TOP关键字分,但是使用TOP分页的原理是需要查出结果再筛选的,如果数据量大,TOP并不是一个好的选择

CREATE PROCEDURE spPage
	@pageSize INT,		--每页显示的记录数
	@pageIndex INT 		--显示第几页
AS
BEGIN
	DECLARE @returnValue INT --记录总数

	SELECT @returnValue=COUNT(1) from Students(NOLOCK)

	--计算应返回的结果集
	SELECT * FROM Students(NOLOCK)
	WHERE Id>(@pageIndex-1)*@pageSize and Id<=@pageIndex*@pageSize

	RETURN @returnValue
END

后台准备工作:
(1)引入AspNetPager.dll工具

(2)在webConfig的system.web标签中加入如下代码:
在这里插入图片描述
(3)创建DataProvider类,用于建立数据库连接,主要保证连接数的唯一

public class DataProvider
{
    private static volatile SqlConnection sqlConnection;
    private static object lockObj = new object();
    public static SqlConnection getConnection(string connectionStr)
    {
        lock(lockObj)
        { 
            if(sqlConnection==null)
            {
                sqlConnection = new SqlConnection(connectionStr);
            }
            return sqlConnection;
        }
    }
}

(4)创建Pager类,用于分页,因为只是个Demo,没有做更多的扩展,如果要通用性,这里可以在加入表名,存储那边加个参数用动态sql拼表名

public class Pager
{
    private DataSet _data;   //数据结果集
    private int pageSize;   //每页显示的数据量
    private int pageIndex;  //显示第几页
    private int count;      //总记录数
    private int pageCount;   //总页数

    public Pager(int pageSize, int pageIndex)
    {
        SqlConnection sqlConnection=DataProvider.getConnection("Server=.;user=sa;pwd=sa;database=RYTreasureDB");
        SqlCommand sqlCommand = new SqlCommand("spPage", sqlConnection);
        sqlCommand.CommandType = CommandType.StoredProcedure;
        sqlCommand.Parameters.AddWithValue("@pageIndex", pageIndex);
        sqlCommand.Parameters.AddWithValue("@pageSize", pageSize);
        SqlParameter returnValue_count = new SqlParameter("@returnValue",SqlDbType.Int);
        returnValue_count.Direction = ParameterDirection.ReturnValue;
        sqlCommand.Parameters.Add(returnValue_count);
        DataSet ds = new DataSet();
        SqlDataAdapter sda = new SqlDataAdapter(sqlCommand);
        sda.Fill(ds);
        //绑定相关数据项
        _data = ds;
        this.pageSize = pageSize;
        this.pageIndex = pageIndex;
        this.count = Convert.ToInt32(returnValue_count.Value);
        this.pageCount = (int)Math.Ceiling((Double)count / pageSize);
    }
    public int PageIndex
    {
        get { return pageIndex; }
    }
    public int PageCount
    {
        get { return pageCount; }
    }
    public DataSet data
    {
        get { return this._data; }
    }
    public int Count
    {
        get { return count; }
    }
}

(5)在相应web窗体的cs文件中加入如下代码

	private static Pager page;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        	//anpPage为前端的组件ID,PageSize每页显示数,值由前端指定
            page = new Pager(anpPage.PageSize, 1);
            anpPage.RecordCount = page.Count;
            repeater.DataSource = page.data;
            repeater.DataBind();
        }
    }
    protected void anpPage_PageChanged(object sender, EventArgs e)
    {
        page = new Pager(anpPage.PageSize, anpPage.CurrentPageIndex);
        anpPage.RecordCount = page.Count;
        repeater.DataSource = page.data;
        repeater.DataBind();
    }

前台准备工作:

编号 姓名 性别 电话
<%# Eval("id") %> <%# Eval("name") %> <%# Eval("sex").ToString() == "False"?"男":"女" %> <%# Eval("phone") %>

结果展示:
B/S模式分页_第1张图片
B/S模式分页_第2张图片

你可能感兴趣的:(C#)