天天看點

【自然架構】QuickPagerSQL——專門生成分頁用的SQL的類庫

   分享一個生成分頁用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等。而且還可以擴充。見下面的類圖:

【自然架構】QuickPagerSQL——專門生成分頁用的SQL的類庫

  使用方法:這個就很簡單了,設定屬性,調用函數就可以了。

【自然架構】QuickPagerSQL——專門生成分頁用的SQL的類庫
【自然架構】QuickPagerSQL——專門生成分頁用的SQL的類庫

代碼

/// <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兩個檔案夾。

  目前正在考慮如何拆分這個大的解決方案。

繼續閱讀