標籤:
在使用oracle時,沒有top這個屬性,如果想限制查詢數量,必須使用偽欄位ROWNUM
可以看到這裡第一列沒有title的欄位就是rownum欄位,在oracle插入資料的時候內建的,無需人為添加。
我們如果想要實現控制查詢數量,可以利用這個欄位。
方案一:
我們可以寫成
SELECT * FROM TA_新聞 WHERE ROWNUM <= 3 ORDER BY 發布時間 DESC
來控制顯示三條記錄。
但是,我們注意到這個ROWNUM是在插入資料時產生的,也就是說如果我們新插入一條發布時間比第3條還早的新聞,他也會出現在最後一個,這樣ROWNUM<3就檢索不到新加的資料。
這樣我們就需要利用子查詢來解決這個問題了。
方案二:
我們把它寫成
SELECT * FROM ( SELECT * FROM TA_新聞 ORDER BY 發布時間 DESC) WHERE ROWNUM <= 3 ORDER BY ROWNUM ASC;
這樣我們查詢的實際上是一張暫存資料表(括弧內的結果返回成一張新的表),這張表的ROWNUM就是按照"發布時間"的逆序來排序的,我們再在外層進行ROWNUM的篩選就可以得到想要的結果了。
以上介紹了SQL的原理,那麼怎麼將它用在asp.net裡呢?
試過的朋友會發現這裡的子查詢在資料集裡運行是不通過的,那麼我們就需要編輯預存程序來解決這個問題。
create or replace procedure 顯示新聞列表(p_顯示條數 int, P_RESULT OUT SYS_REFCURSOR)asbegin OPEN P_RESULT FOR SELECT * FROM ( SELECT * FROM TA_新聞 ORDER BY 發布時間 DESC) WHERE ROWNUM <= p_顯示條數 ORDER BY ROWNUM ASC;end 顯示新聞列表;
以上預存程序僅僅傳遞了一個參數就是現實條數,這樣使用者只用輸入顯示條數就可以反饋出相應條數的新聞,並且是時間逆序排列的,這樣使用者看到的始終是最新的幾條新聞。
這裡的第二個參數
P_RESULT 是一個OUT型的參數,返回的是一個遊標。(遊標的意思其實就是一張表,將結果作為一張表存在遊標中並作為傳回值)。
編寫好這個預存程序中,再將它拖入資料集中,就可以當表格一樣用ObjectDataSource綁定這個方法了。這樣再利用repeater綁定ObjectDataSource就可以控制顯示條數了。
解決asp.net中repeater控制項的顯示數量控制