[习题]上集 Ch 14-4 撰写ADO.NET DataReader的分页程式#3(搭配SQL 2012指令 OFFSET...FETCH)
摘要:[习题]上集 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
- ORDER BY 会强制使用 OFFSET 和 FETCH 子句。
- OFFSET 子句则强制搭配 FETCH 使用。您绝对不可以使用 ORDER BY … FETCH。
- TOP 不可以在相同查询运算式中与 OFFSET 和 FETCH 结合。
- OFFSET/FETCH 资料列计数运算式可以是任何将传回整数值的算术、常数或参数运算式。资料列计数运算式不支援纯量子查询。
如果您是撰写 ASP.NET MVC,分页的原理其实雷同。
请参阅 http://mis2000lab.pixnet.net/blog/post/35057473
或是 https://mis2000lab.blogspot.tw/2018/04/aspnet-mvcskip-take.html