分享一個生成分頁用SQL的函數庫
一般一提到分頁,大家就會想到存儲過程,而大多數情況都是在存儲過程裡面拼接SQL,我覺得與其在存儲過程裡面拼接,還不如寫個程式來拼接。這樣更便于維護,而且效率也不差多少。
是以我就寫了這個類庫—— QuickPagerSQL。
一開始這個功能是在QuickPager分頁控件内部的,但是放在一起的話,違反了單一職責。是以把它獨立了出來。現在QuickPagerSQL是一個獨立的類庫,可以單獨調用。
他的目的很明确,就是根據已知條件,依據分頁算法,來拼接需要的SQL。
需要設定的屬性有:表名/視圖名、要顯示的字段名、排序字段及方式、主鍵字段名、查詢條件、一頁的記錄數、總記錄數、分頁算法。
然後依據選擇的分頁算法生成相應的SQL。而這個SQL有兩類,一類是擷取總記錄數;一類是讀取指定頁号的SQL。
為了提高效率,讀取記錄的SQL又分為了三個,讀取首頁的記錄、讀取最後一頁的記錄、讀取指定頁号的記錄。
其實隻需要一個“讀取指定頁号的記錄”的SQL就可以了,那麼為什麼還要一個讀取首頁的SQL呢?這個是為了提高效率。
因為一些數情況下,讀取第一頁可以用 select top PageSize * 的方式來擷取。這個既簡單,效率也是很高的(相同條件下)。而首頁還負責一個任務,那就是統計總記錄數,而這個是比較占用時間的,那麼在顯示首頁的時候,盡量優化一下是很必要的。是以就單獨設定了一個讀取首頁記錄的SQL。
那麼讀取最後一頁記錄的SQL又是什麼目的呢?這個主要是為了修改颠倒top的一個bug。用過颠倒top的都會發現有一個郁悶的地方,那就是在顯示最後一頁的時候,如果記錄數不夠pageSize的時候,也會顯示pagesize條記錄。這是在颠倒的時候出現的問題,本身沒有什麼解決的方法(目前我還沒有找到,不知道哪位高人能夠解決)。于是我就單獨做了一個讀取最後一頁記錄的SQL。用這個SQL來修正颠倒top的這個bug。
主要就是這樣了。
這個并不是代碼生成器,而是要在運作時動态生成SQL的。
目前提供了多種分頁算法,Max、颠倒Top、表變量、Row_Number等。而且還可以擴充。見下面的類圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauYmZmFWMmVWMmJGMwUzY2ADOjVGNmhjYjJTM3U2Y2gjYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpg)
使用方法:這個就很簡單了,設定屬性,調用函數就可以了。
代碼
/// <summary>
/// 生成分頁用的SQL的示範
/// </summary>
public partial class PagerSQLPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btn_Create_Click(object sender, EventArgs e)
//生成分頁用SQL
string tableName = this.txt_TableName.TextTrimNone ;
string orderByColumns = this.txt_OrderByColumns.TextTrimNone ;
string PKColumn = this.txt_PKColumn.TextTrimNone ;
string tableQuery = this.txt_Query.TextTrimNone ;
string showColumns = this.txt_ShowColumns.TextTrimNone ;
string pageIndex = this.txt_Index.TextTrimNone;
string pageCount = this.txt_PageCount.TextTrimNone;
if (!Functions.IsInt(pageIndex))
{
Functions.PageRegisterAlert(Page, "頁号必須是整數!");
return;
}
QuickPagerSQL sql = new QuickPagerSQL();
sql.TableName = tableName; //表名或者視圖名
sql.TableShowColumns = showColumns; //要顯示的字段
sql.TablePKColumn = PKColumn; //主鍵
sql.TableOrderByColumns = orderByColumns; //排序字段
sql.TableQuery = tableQuery; //查詢條件
sql.PageCount = int.Parse(pageCount); //一頁的記錄數
//選擇一種分頁算法
sql.SetPagerSQLKind = (PagerSQLKind)Int32.Parse(this.lst_Kind.SelectedValue) ;
//拼接SQL;
sql.CreateSQL();
//統計總記錄數的SQL
this.txt_SQL1.Text = sql.GetRecordCountSQL;
//實際中需要用上面的SQL到資料庫裡統計,這裡“虛構”一個總記錄數。
sql.RecordCount = 200;
//擷取指定頁資料的SQL
this.txt_SQL2.Text = sql.GetSQLByPageIndex(int.Parse(pageIndex));
}
目前分頁控件還沒有分離出來,是以還都在自然架構源碼的大解決方案裡。
QuickPagerSQL的位置:
_UDRM 項目裡的 SQL_Pager 檔案夾,這裡的代碼都是。
QuickPager分頁控件的位置:
_WebControls項目裡的 Pager、Pager_UI兩個檔案夾。
目前正在考慮如何拆分這個大的解決方案。