步步为营-47-分页显示的SQL语句
说明:分页显示在实际业务中经常需要用到,其SQL语句分两种
1:分页显示SQL语句
--方法一:跳过多少行,选中多少行 --每页n条,选择第m页--n=2 m=3 --select top(n) * from 表 where 主键 not in (select top(m-1)*n 主键 from 表); select * from UserInfo select top(2) * from UserInfo where Empid not in (select top((3-1)*2) EmpId from UserInfo); --方法二,通过rowNumber函数,但是只能当作临时表 select * from(select * ,ROW_NUMBER() over (order by EmpId) as num from UserInfo) as T where T.num between (3-1)*2+1 and 3*2; --over开窗函数的的另一个用法 select top(2) * ,AVG(StuAge) over() as 平均年龄 from UserInfo;
2:分页显示存储过程
--03-01 判断存储过程是否存在,如果存在则进行删除 if(exists(select * from sys.all_objects where name ='usp_UserInfo_GetPageData')) drop proc usp_UserInfo_GetPageData go --03-02 创建分页的存储过程 create procedure usp_UserInfo_GetPageData @PageSize int, @PageIndex int, @TotalCount int output as BEGIN select * from (select * ,ROW_NUMBER() over (Order by EmpId) as rowNumber from UserInfo where Delflag = 0) as temp where temp.rowNumber between (@PageSize*(@PageIndex-1)+1) and (@PageSize*@PageIndex) select @TotalCount = count(1) from UserInfo where Delflag = 0 END --03-02 调用存储过程 declare @TotalCount int exec usp_UserInfo_GetPageData 2,3,@TotalCount out select @TotalCount
3:在c#中实现
3.1,发现输出参数没有什么用,修改存储过程
ALTER procedure [dbo].[usp_UserInfo_GetPageData] @PageSize int, @PageIndex int as BEGIN select * from (select * ,ROW_NUMBER() over (Order by EmpId) as rowNumber from UserInfo where Delflag = 0) as temp where temp.rowNumber between (@PageSize*(@PageIndex-1)+1) and (@PageSize*@PageIndex) END
3.2 调用代码
#region //06-06 跳到某一页---存储过程 private void btnSkip_Click(object sender, EventArgs e) { //01-00 设置强类型数据源 List<UserInfo> userInfoList = new List<UserInfo>(); int pageIndex =int.Parse(txtSkipPage.Text); using (SqlConnection conn = new SqlConnection( ConnStr)) { using (SqlCommand cmd = conn.CreateCommand()) { conn.Open(); cmd.CommandText = "usp_UserInfo_GetPageData"; cmd.Parameters.Add(new SqlParameter("@PageSize", pageSize)); cmd.Parameters.Add(new SqlParameter("@PageIndex", pageIndex)); cmd.CommandType = CommandType.StoredProcedure; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { //数据封装 UserInfo userInfo = new UserInfo(); userInfo.EmpId = int.Parse(reader["EmpId"].ToString()); userInfo.Pwd = reader["Pwd"].ToString(); userInfo.StuName = reader["StuName"].ToString(); userInfo.StuAge = int.Parse(reader["StuAge"].ToString()); userInfo.Delflag = Char.Parse(reader["Delflag"].ToString()); userInfo.ClassNo = int.Parse(reader["ClassNo"] == DBNull.Value ? "-1" : reader["ClassNo"].ToString()); //添加到列表中 userInfoList.Add(userInfo); } } } } //01-06 配置数据源 this.dataGridView1.DataSource = userInfoList; } #endregion