`
yangle926
  • 浏览: 58321 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

一个SQL Server2000和2005都能用的分页方法

    博客分类:
  • .NET
阅读更多
    (1)存储过程(SQL2000和2005下都可用):
USE [Northwind]
GO
/****** 对象:  StoredProcedure [dbo].[p_GetOrders]    脚本日期: 03/29/2010 23:00:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER  PROCEDURE [dbo].[p_GetOrders]
@strWhere   varchar(1500),   -- 查询条件 (注意: 不要加 where)
@PageSize    int = 50,          -- 页尺寸
@PageIndex   int = 1,           -- 页码
@PageCount   int out,           --总页数
@RecordCount int out            --总记录数
AS 
BEGIN
 declare @strSQL   varchar(5000)       -- 主语句
 declare @strTmp   varchar(110)        -- 临时变量
 declare @strOrder varchar(400)        -- 排序类型
 select @RecordCount=count(*) from SaleInvoices
 select @PageCount=ceiling(@RecordCount/@PageSize)
 set @strTmp = '<(select min'
 set @strOrder = ' order by OrderID desc'
 if @PageIndex = 1
 begin
     if @strWhere != ''   
     set @strSQL = 'select top ' + str(@PageSize) +' *  from Orders where ' + @strWhere + ' ' + @strOrder
     else
     set @strSQL = 'select top ' + str(@PageSize) +'  *   from Orders '+ @strOrder
     --如果是第一页就执行以上代码,这样会加快执行速度
 end
 else
 begin
 --以下代码赋予了@strSQL以真正执行的SQL代码
 set @strSQL = 'select top ' + str(@PageSize) +'  *  from Orders 
 where OrderID' + @strTmp + '(OrderID) from (select top ' + str((@PageIndex-1)*@PageSize) + ' OrderID from Orders' + @strOrder + ') as tblTmp)'+ @strOrder
 if @strWhere != ''
     set @strSQL = 'select top ' + str(@PageSize) +'  * from Orders 
      where OrderID' + @strTmp + '(OrderID) from 
    (select top ' + str((@PageIndex-1)*@PageSize) + ' OrderID from Orders where ' + @strWhere + ' '
         + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
 end 
 --print (@strSQL) 
 exec (@strSQL)
END

    使用:将存储过程中的Orders改为自己所要查询数据的表的名称,OrderID改为自己所用表中的标识字段(具有唯一值就可以)
    存储过程测试:
declare @PageCount int 
declare @RecordCount int
exec p_GetPaging '[no] like "%RB%"',10,3,@PageCount,@RecordCount

    (2)页面前台:
......
	<asp:TextBox ID="txtAllSearch" runat="server"></asp:TextBox>
        <asp:Button ID="btnAllSearch" runat="server" Text="搜索" onclick="btnAllSearch_Click" />
	<asp:GridView ID="GvSAll" runat="server">
        </asp:GridView>
        <asp:LinkButton ID="lbtnPre" runat="server" onclick="lbtnPre_Click" Text="1">1</asp:LinkButton>    
        <asp:LinkButton ID="lbtnNext"  runat="server" onclick="lbtnNext_Click" Text="2">2</asp:LinkButton> 
......

    注:按钮中的文本设为"1"和"2"
    (3)页面后台:
	private int PageSize = 5;  //全局变量
        private int PageIndex = 1;  //全局变量
	//获取数据方法
	protected DataTable getPageDataSource(string sqlWhere, int pageIndex, int pageSize)
        {
            string connStr = ConfigurationManager.AppSettings["MsSql2nd"].ToString();
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            string sql = "p_GetPaging";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@strWhere",SqlDbType.VarChar);
            cmd.Parameters["@strWhere"].Value = sqlWhere;
            cmd.Parameters.Add("@PageIndex", SqlDbType.Int);
            cmd.Parameters["@PageIndex"].Value = pageIndex;
            cmd.Parameters.Add("@PageSize", SqlDbType.Int);
            cmd.Parameters["@PageSize"].Value = pageSize;
	    cmd.Parameters.Add("@RecordCount",SqlDbType.Int);
            cmd.Parameters["@RecordCount"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@PageCount", SqlDbType.Int);
            cmd.Parameters["@PageCount"].Direction = ParameterDirection.Output;
            SqlDataReader sdr = cmd.ExecuteReader();
            DataTable dt = new DataTable();
            dt.Load(sdr);
            sdr.Dispose();
            conn.Close();
            return dt;
        }
	//获取总页数
	protected int getPageCount(string sqlWhere, int pageIndex, int pageSize)
        {
            string connStr = ConfigurationManager.AppSettings["MsSql2nd"].ToString();
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            string sql = "p_GetPaging";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@strWhere",SqlDbType.VarChar);
            cmd.Parameters["@strWhere"].Value = sqlWhere;
            cmd.Parameters.Add("@PageIndex", SqlDbType.Int);
            cmd.Parameters["@PageIndex"].Value = pageIndex;
            cmd.Parameters.Add("@PageSize", SqlDbType.Int);
            cmd.Parameters["@PageSize"].Value = pageSize;
	    cmd.Parameters.Add("@RecordCount",SqlDbType.Int);
            cmd.Parameters["@RecordCount"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@PageCount", SqlDbType.Int);
            cmd.Parameters["@PageCount"].Direction = ParameterDirection.Output;
            SqlDataReader sdr = cmd.ExecuteReader();
            DataTable dt = new DataTable();
            dt.Load(sdr);
            sdr.Dispose();
            conn.Close();
            //return dt;
	    int pageCount = (int)cmd.Parameters["@PageCount"].Value;
            return pageCount;
        }
	//搜索按钮事件
	protected void btnAllSearch_Click(object sender, EventArgs e)
        {
            string sestr = this.txtAllSearch.Text.Trim();
            string sqlWhere = "";
            if (sestr == "")
            {
                sqlWhere = "";
            }
            else
            {
                sqlWhere = "[no] like \"%" + sestr + "%\""; //注意转义字符的使用
            }
            DataTable dt = getPageDataSource(sqlWhere, PageIndex, PageSize);
            this.GvSAll.DataSource = dt; ;
            this.GvSAll.DataBind();
        }
	//前一页事件
	protected void lbtnPre_Click(object sender, EventArgs e)
        {
            string sestr = this.txtAllSearch.Text.Trim();
            string sqlWhere = "";
            if (sestr == "")
            {
                sqlWhere = "";
            }
            else
            {
                sqlWhere = "[no] like \"%" + sestr + "%\""; 
            }
            PageIndex = Convert.ToInt16(this.lbtnPre.Text);
            PageIndex -= 1;
            if (PageIndex<=1)
            {
                PageIndex = 1;
            }
            DataTable dt = getPageDataSource(sqlWhere, PageIndex, PageSize);
            this.lbtnPre.Text = PageIndex.ToString();
            this.lbtnNext.Text = (PageIndex + 1).ToString();
            this.GvSAll.DataSource = dt; ;
            this.GvSAll.DataBind();
        }
	//后一页事件
	protected void lbtnNext_Click(object sender, EventArgs e)
        {
            string sestr = this.txtAllSearch.Text.Trim();
            string sqlWhere = "";
            if (sestr == "")
            {
                sqlWhere = "";
            }
            else
            {
                sqlWhere = "[no] like \"%" + sestr + "%\""; 
            }
            PageIndex=Convert.ToInt16(this.lbtnNext.Text);
            PageIndex += 1;
	    int PageCount = getPageCount("", 1, 5);
            if (PageIndex>PageCount+1)
            {
                PageIndex = PageCount+1;
            }
            DataTable dt = getPageDataSource(sqlWhere, PageIndex, PageSize);
            this.lbtnNext.Text = PageIndex.ToString();
            this.lbtnPre.Text = (PageIndex - 1).ToString();
            this.GvSAll.DataSource = dt; ;
            this.GvSAll.DataBind();            
        }

    注:在两个翻页事件中利用了两按钮自身的文本值来保存参数,并相与影响
分享到:
评论

相关推荐

    Hibernate+sqlserver2000分页

    综上所述,`Hibernate+sqlserver2000分页`是一个结合了ORM框架和数据库分页策略的技术主题。在实际应用中,开发者需要根据业务需求选择合适的分页方法,并注意性能优化,如避免全表扫描,使用索引来加速查询等。理解...

    SQL Server2005分页查询

    在SQL Server 2005中,分页查询是一个常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要一次性加载一定数量的数据,而不是一次性显示所有数据。以下将详细讲解SQL Server 2005中分页查询的常用方法。...

    jdbc分页实例sqlserver2000

    标题中的“jdbc分页实例sqlserver2000”指的是使用Java Database Connectivity (JDBC) API来实现数据库分页查询的示例,特别是在SQL Server 2000这个特定的数据库管理系统上。JDBC是Java中用于与各种类型数据库交互...

    struts2+sqlserver2000+jstl+分页

    综上所述,这个"struts2+sqlserver2000+jstl+分页"示例项目展示了如何整合这四个技术,构建一个能够动态分页显示数据库内容的Web应用。开发过程中,需要理解每个技术的作用,以及它们之间的协作方式。例如,Struts2...

    mybatis中进行sqlserver分页

    mybatis中,sqlserver分页

    sql Server 通用分页存储过程

    sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程

    SQL Server 2000 通用分页过程

    本文将深入探讨一个针对 SQL Server 2000 的通用分页存储过程。该存储过程采用 `TOP + MAX(ID)` 的方法实现分页功能,并强调了关键字(`Keyword`)选择对于性能的影响。 #### 存储过程设计 此存储过程名为 `p_...

    sqlserver+group by分组查询分页存储过程

    根据给定的SQL Server存储过程...总之,SQL Server的`GROUP BY`分组查询、存储过程和分页技术都是数据库管理和数据分析中不可或缺的工具。正确理解和灵活运用这些技术,可以极大地提升数据库应用程序的性能和用户体验。

    sql server 2008通用分页

    SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。

    java 连接sqlserver数据库查询,并分页显示

    然后,编写一个方法来获取数据库连接: ```java public static Connection getConnection() { String url = "jdbc:sqlserver://localhost:1433;databaseName=myDatabase"; String username = "myUsername"; ...

    sql server 分页大全

    `OFFSET`和`FETCH`是SQL Server 2000之后版本引入的分页关键字,但在2000版本中,我们需要使用其他方法,如`TOP`和`ROW_NUMBER()`函数。 二、分页TSQL 在SQL Server 2000中,由于没有内置的`OFFSET`和`FETCH`功能...

    java语言的分页查询功能(mysql和sql server)

    例如,MyBatis的`selectList`方法可以接受一个`RowBounds`对象,实现分页功能。 总结,Java中的分页查询涉及数据库操作、SQL构造和Java代码实现。理解分页原理和数据库分页语法,掌握JDBC基本用法,再根据实际需求...

    SQL Server 2000下的通用分页存储过程

    SQL Server 2000下的通用分页存储过程.sql

    sql server分页技术(SQL Server 与Access数据库相关分页技术)

    这种方法涉及创建一个临时表,存储排序后的主键和rowId,然后使用这些信息进行分页。虽然这种方法提供了一种灵活的排序方式,但对内存资源的需求较高,不适合大数据量场景。 5. **ROW_NUMBER 函数**: SQL Server...

    sqlserver2005分页函数

    一个非常好的sql2005分页函数,简单实用,希望对你有所帮助

    asp+sqlserver2005万能分页存储过程源码

    asp+sqlserver2005万能分页存储过程源码 sqlserver2005源码下载,很灵活的

    SQL server 分页查询

    这里,我们使用了一个公共表表达式(CTE),对`Products`表进行排序,然后通过`OFFSET`跳过前几行,再用`FETCH NEXT`获取接下来的指定行数,从而实现分页。 ### 传统子查询方式 对于早期版本的SQL Server,如2005...

    SqlServer数据库分页

    在SQL Server中,有两种主要的分页方法:`TOP`和`OFFSET-FETCH`,以及`ROW_NUMBER()`函数配合`WHERE`子句。 1. **TOP 和 OFFSET-FETCH**: - `TOP`关键字用于获取查询结果的前n行。例如,`SELECT TOP 10 * FROM ...

    jsp+sqlserver分页

    **标题:“jsp+sqlserver分页”** 在Web开发中,分页是一种常见的用户界面设计技术,用于在大量数据中提供可浏览性。本项目基于`SQL Server 2005`数据库,结合`Struts`框架和`JavaBean`组件,实现了在JSP页面上进行...

Global site tag (gtag.js) - Google Analytics