zoukankan      html  css  js  c++  java
  • sql page reship

    sql page reship
     
     如果数据表中有唯一的自增索引,并且这个字段没有出现断号现象。检索页面大小的块区数据就非常简单了。通过简单的Sql语句就可以实现这个功能: 
    select 
    * from orders where orderid between 10248 and 10253
    其中,开始编号为:(CurrentPageIndex 
    - 1* PageSize  结束编号为:CurrentPageIndex * PageSize
        当然,如果这个字段断号不是很严重,而且允许不是很严格的按照每页条数分页,这样的方法也是可以用的。
        如果这个字段断号,或者需要按照其他条件排序分页,就要复杂些了。首先要获得这个页面需要显示的编号,然后再按照这个编号获得需要的块区数据。根据编号获得块区数据很简单。不过用下面方式获得数据排序并不是按照指定的id列表顺序,这时候还要附加order by 命令。 
    select 
    * from orders where orderid in (10248,10249,10250,10251,10252,10253) order by orderid desc
     获得这个页面需要显示的编号列表就复杂多了,而且有多种方案:
    方案一:维护一个表,这个表记录需要显示的这些编号排序顺序。(这个表可以是临时表,也可以是物理表)。下面演示了利用一个全局临时表。这个全局临时表记录需要显示的编号。注意排序,这里的order by 就是需要显示的排序顺序。
    create table ##temptable(
    iid 
    int IDENTITY (11) NOT NULL,
    mainid 
    int NOT NULL
    )

    insert ##temptable(mainid) select OrderID from orders order by OrderID desc

    select 
    * from ##temptable

    drop table ##temptable 
    -- 实际执行时候,删除全部临时表当然不再这里执行。
     这个临时表存在,获得指定分页的分块数据就很简单了。看下面代码:
    create table ##temptable(iid 
    int IDENTITY (11) NOT NULL,mainid int NOT NULL)
    insert ##temptable(mainid) select OrderID from orders order by OrderID desc
    declare @PageSize 
    int,@CurrPage int,@strSQL varchar(2000),@IDStr varchar(1000)
    select @PageSize 
    = 30
    select @CurrPage 
    = 2
    select @IDStr 
    = ''
    select @IDStr 
    = @IDStr + ltrim(rtrim(str(MainID))) + ',' from ##temptable 
    where iid between ((@CurrPage
    -1)*@PageSize+1) and @CurrPage*@PageSize
    if @IDStr <> '' 
    begin
     select @IDStr 
    = left(@IDStr,len(@IDStr)-1)
    end
    select @strSQL 
    = 'select * from orders where OrderID in ('+@IDStr+')  order by OrderID desc '
    exec(@strSQL)
    drop table ##temptable
     注意:实际使用这个方案的时候,还要考虑何时更新这个全局临时表,一般是放到计划任务中,定时更新这个汇总表。
    方案二:每次都去查询,每次获得最新的编号顺序。由于这时候不存在这个临时表,书写获得需要显示页面的编号的字符串就需要点技巧,看下面的代码:
    declare @PageSize 
    int,@CurrPage int,
    @topnum 
    int,@previous int
    select @PageSize 
    = 30
    select @CurrPage 
    = 2
    select @topnum 
    = @CurrPage * @PageSize
    select @previous 
    = (@CurrPage - 1* @PageSize
    declare @i 
    int,@IDStr nvarchar(500),@strSQL nvarchar(1000)
    select @i 
    = 0
    select @strSQL 
    = N''
    select @strSQL 
    = @strSQL + N' select top '+str(@topnum)+ ' @i = @i + 1 '
    select @strSQL 
    = @strSQL + N',  @IdStr = '
    select @strSQL 
    = @strSQL + N'case when @i > '+str(@previous)+' then  @IdStr + ltrim(rtrim(str(OrderID))) + '','' '
    select @strSQL 
    = @strSQL + N'else N''''end '
    select @strSQL 
    = @strSQL + N'from Orders '
    select @strSQL 
    = ltrim(rtrim(@strSQL)) + N' order by OrderID desc '
    Select @IdStr 
    = N''
    exec sp_executesql @strSQL,N
    '@i int,@IdStr varchar(500) output',@i,@IdStr output
    if len(rtrim(ltrim(@IdStr))) > 0
    begin
     select @IdStr 
    = left(@IdStr,len(@IdStr)-1)
    end
    select @strSQL 
    = 'select * from orders where OrderID in ('+@IDStr+')'
    exec(@strSQL)
     ASP.net 的 DataGrid 提供了使用这种分区的数据的方法。 DataGrid 通过 AllowCustomPaging 和 VirtualItemCount 属性支持块区操作。如果 AllowCustomPaging 为 
    true,则 DataGrid 不会根据 CurrentPageIndex 计算数据模型中的起始显示位置。DataGrid 将显示数据模型中的所有数据,而页导航栏将当前位置报告为 (VirtualItemCount+PageSize-1)/PageSize 之 CurrentPageIndex 页。下面的示例说明此功能。
     
    protected void BindDataGrid(int currpage)
     {
      
    string strConn = "Data Source=(local);Integrated Security=SSPI;database=Northwind";
      
    // 请确认 机器名/ASPNET 用户可以访问Northwind数据库
      SqlCommand cmd = new SqlCommand();
      SqlConnection conn 
    = new SqlConnection(strConn);
      SqlParameter[]  parms 
    = new SqlParameter[] {
       
    new SqlParameter("@PageSize",SqlDbType.Int),
       
    new SqlParameter("@CurrPage",SqlDbType.Int),
       
    new SqlParameter("@SearchSql",SqlDbType.NVarChar,128),
       
    new SqlParameter("@Count",SqlDbType.Int),
      };
      parms[
    0].Value = DataGrid1.PageSize;
      parms[
    1].Value = (currpage+1); 
      
    //  数据库的分页算法第一页是1  DataGrid的第一页是0
      parms[2].Value = DBNull.Value;
      parms[
    3].Direction = ParameterDirection.Output;
      parms[
    3].Value = DBNull.Value;
      DataSet DS 
    = new DataSet();
      
    try 
      {
       
    if (conn.State != ConnectionState.Open) conn.Open();
       cmd.Connection 
    = conn;
       cmd.CommandText 
    = "Selected_Page_List";
       cmd.CommandType 
    = CommandType.StoredProcedure;
       
    if (parms != null
       {
        
    foreach (SqlParameter parm in parms)
         cmd.Parameters.Add(parm);
       }
       SqlDataAdapter DA 
    = new SqlDataAdapter(cmd);
       DA.Fill(DS);
       
    int aa = Convert.ToInt32(parms[3].Value.ToString());
       cmd.Parameters.Clear();
       
    if (currpage == 0)
       {
        DataGrid1.VirtualItemCount 
    = aa;
       }
       DataGrid1.CurrentPageIndex 
    = currpage;
       DataGrid1.DataSource 
    = DS;
       DataGrid1.DataBind();
      }
      
    catch(Exception ewx)
      {
       conn.Close();
       Response.Write (ewx.Message.ToString());
       Response.End();
      }
     }

        
    void Page_Load(Object sender, EventArgs E ) {
      
    if (!IsPostBack) 
      {
       BindDataGrid(
    0);
       
    // 第一次打开这个页面,访问分页的第一页
      }
        }

        
    void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e) {
      BindDataGrid(e.NewPageIndex);
        }
    如果你有更多数据量的表稍加修改,也可以使用本演示程序。其下是演示代码下载,演示代码使用的是方案二。使用方法看readme.txt文件。
    整个演示代码 下载
    http:
    //chs.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/datagrid/doc_datagrid.aspx#paging 
    这里演示了利用DataGrid 的这个功能(没有本文中讨论的利用存储过程获得分区数据)。如对DataGrid的这个功能不太熟悉,请先看这里。
    我最近碰到大数据量分页的问题,经过跟CSDN网友讨论,觉得比较可行的方案就是上面提到的2种方案,有谁有更好的方案,或者发现问题请Email联系我,thanks
    ALTER PROCEDURE GZ_News_GetResultsByTable
    (
     
     @PageSize int,
     @PageIndex int,
            @Content varchar(20)
    )
    AS
     SET NOCOUNT ON

     DECLARE @PageLowerBound int
     DECLARE @PageUpperBound int
     DECLARE @RowsToReturn int
     DECLARE @MoreRecords int
     

     SET @RowsToReturn = @PageSize * @PageIndex
     SET @MoreRecords = @RowsToReturn + 1
     SET ROWCOUNT @MoreRecords


     SET @PageLowerBound = @PageSize * (@PageIndex-1)
     SET @PageUpperBound = @PageLowerBound + @PageSize + 1

     /*CREATE TABLE #PageIndex
     (
      IndexID int IDENTITY (1, 1) NOT NULL,
      UpdateTime datetime,
                    ArticleID int
     )*/
           
            declare @IndexTable  table(
                                       IndexID int identity(1,1),
                                       UpdateTime datetime,
                                       ArticleID  int
                                     ) --定义表变量


            if((@Content is not null) and (@Content<>''))
      INSERT INTO  @IndexTable (ArticleID,UpdateTime)
     (SELECT ArticleID,UpdateTime FROM Article a WHERE Contains(Content, @Content)
                    union
                    SELECT ArticleID,UpdateTime FROM Article a where Contains(Title,@Content))   ORDER BY UpdateTime Desc

            else
                    INSERT INTO  @IndexTable(ArticleID)
                    SELECT ArticleID  FROM Article a Order By UpdateTime desc

            /*IF (@MoreRecords > (SELECT count(*) FROM #PageIndex))
      SET @MoreRecords = @RowsToReturn*/

     SELECT
      a.ArticleID,
                    a.Title,
                    a.UpdateTime,
                    a.Content,
                    a.IncludePic,
                    a.DefaultPicUrl,
                    a.CopyFrom
      
     FROM
       @IndexTable IndexTable,
      Article a
      
     WHERE
      a.ArticleID = IndexTable.ArticleID AND
      IndexTable.IndexID > @PageLowerBound AND
      IndexTable.IndexID < @PageUpperBound
     ORDER BY
      IndexTable.IndexID


     SET NOCOUNT OFF


     

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/hq2008/p/837213.html
Copyright © 2011-2022 走看看