摘要:[习题]上集 Ch 14-4 撰写ADO.NET DataReader的分页程式#3(搭配SQL 2012指令 OFFSET...FETCH)

速度比起 ROW_Number差不多,
但比较起来,新的写法比 ROW_Number省资源

 

 

上一篇文章,也是透过SQL指令来进行资料分页

远比在「HTML画面上」写程式分页快速多了!!

详见:[习题]上集 Ch 14-4 撰写ADO.NET DataReader的分页程式#1(搭配SQL指令 ROW_NUMBER)

http://www.dotblogs.com.tw/mis2000lab/archive/2010/11/30/datareader_paging_row_number.aspx

 

今天看书时,发现一个新的指令

SQL 2012起,多了 OFFSET...FETCH的指令来辅助  Order By,也可以做资料分页喔。 

教学影片  https://www.youtube.com/watch?v=37q5qez6cbU

 

如果您是撰写 ASP.NET MVC,分页的原理其实雷同。

请参阅  http://mis2000lab.pixnet.net/blog/post/35057473
或是  https://mis2000lab.blogspot.tw/2018/04/aspnet-mvcskip-take.html



 

当然,您跟我一样,花十分钟看一下SQL Server大师  --德瑞克的网站就会了

请看:SQL Server 2012 :分页处理:认识 OFFSET 和 FETCH 子句

          http://sharedderrick.blogspot.tw/2012/06/t-sql-offset-fetch.html

 

啊!!!!!!!!德瑞克大师的功力灌顶之后,

 我马上把我的分页程式改成这样

只花了两分钟!!!!!(因为我资质弩钝,花了一点时间练习)

  

请打开书本,或是参阅以前的范例

把SQL指令改成这样

        //========================
        //== 组合SQL指令 =============
        SqlDataReader dr = null;

//== ADO.NET 参数的写法 ==
String SqlStr = "Select test_time, id, title, summary from test Order By id

OFFSET @Page1 ROWS FETCH NEXT @Page2 ROWS ONLY";

        SqlCommand cmd1 = new SqlCommand(SqlStr, Conn);
        cmd1.Parameters.AddWithValue("@Page1", NowPageCount);
        cmd1.Parameters.AddWithValue("@Page2", PageSize);

        
       dr = cmd1.ExecuteReader();
        //== 第三,自由发挥 ======================
        while (dr.Read())
        {
            haveRec = true;   //.....后续省略.....

 完成了!YA!!

 

 

如果我的说法没错的话,这是我「个人」整理出来的重点:

OFFSET X ROWS   代表你忽略了前面几笔记录(也就是从这里  开始读取,从头开始算起,第一 "页"的编号请用「零」代表 )

FETCH NEXT Y ROWS ONLY  代表你从「第几列」向后 读取 (我 只要 这几列的记录即可! 或是说,每一页要呈现几笔记录?

  

根据 SQL Server大师  --德瑞克 文章里面的说法

--  速度比起 ROW_Number差不多,

--  但比较起来,新的写法比 ROW_Number省资源

 

没错!您还不赶紧去练功....  SQL Server 2012 :分页处理:认识 OFFSET 和 FETCH 子句

  

这里是微软 msdn网站的说明(中文) -- http://technet.microsoft.com/zh-tw/library/gg699618(v=sql.110).aspx

使用 OFFSET - FETCH 的限制
  • ORDER BY 会强制使用 OFFSET 和 FETCH 子句。
  • OFFSET 子句则强制搭配 FETCH 使用。您绝对不可以使用 ORDER BY … FETCH。
  • TOP 不可以在相同查询运算式中与 OFFSET 和 FETCH 结合。
  • OFFSET/FETCH 资料列计数运算式可以是任何将传回整数值的算术、常数或参数运算式。资料列计数运算式不支援纯量子查询。
  
下列范例示范 OFFSET-FETCH 子句搭配 ORDER BY 的使用方式。
范例 1:略过已排序之结果集的前 10 个资料列,并传回其余资料列。 
SELECT * FROM [test] ORDER BY id     OFFSET 10 ROWS;
 
 范例 2:略过已排序之结果集的前 5 个资料列,并传回接下来的 5 个资料列 
SELECT * FROM [test] ORDER BY id 
           OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;  
执行成果如下图
 

如果您是撰写 ASP.NET MVC,分页的原理其实雷同。

请参阅  http://mis2000lab.pixnet.net/blog/post/35057473
或是  https://mis2000lab.blogspot.tw/2018/04/aspnet-mvcskip-take.html

本范例的修改版,搭配 jQuery特效:
 
 
相关文章