[.NET] SQL資料總筆數查詢

SQL資料總筆數查詢

[.NET] SQL資料總筆數查詢

程式下載

範例下載:點此下載

原始碼下載:點此下載

NuGet封裝:點此下載

資料查詢

開發系統時,使用C#執行SQL查詢指令,就可以從SQL資料庫裡查詢所需資料。

SELECT Id, Name FROM Users

資料總筆數查詢

當資料量過多時,系統會需要採用分頁的方式來分批取得資料,但在這之前需要先取得資料總筆數,來告知系統共有多少資料等待處理。這時可以改寫原有的SQL查詢指令,在其中加入COUNT(*),來計算查詢結果的總筆數。(將查詢指令改寫為子查詢來取得資料總筆數,是以方便改寫為前提來設計。)

SELECT COUNT(*) 
FROM   (

         SELECT Id, Name FROM Users

       ) __QueryCountTable

提取為共用方法

上述這個改寫SQL查詢指令的動作,是很機械化的固定動作,透過抽取其中的動作流程,可以建立一個共用方法:GetQueryCountText方法。透過這個GetQueryCountText方法,開發人員傳入查詢的SQL查詢指令,GetQueryCountText方法就會改寫這個SQL查詢指令,回傳一個提供資料總筆數資料的SQL總筆數查詢指令。開發人員使用C#來執行這個SQL總筆數查詢指令,就能在系統中提供資料總筆數查詢的功能。

using (SqlCommand command = new SqlCommand())
{
    // Connection
    command.Connection = connection;

    // CommandText
    command.CommandText = @"SELECT Id, Name FROM Users";

    // QueryCountText
    command.CommandText = SqlCommandExtensions.GetQueryCountText(command.CommandText);

    // Execute
    count = Convert.ToInt32(command.ExecuteScalar());
}

提取為共用方法01

public static string GetQueryCountText(string commandText, string fieldName = "*")
{
    #region Contracts

    if (string.IsNullOrEmpty(commandText) == true) throw new ArgumentNullException();
    if (string.IsNullOrEmpty(fieldName) == true) throw new ArgumentNullException();

    #endregion

    // QueryCountText
    var queryCountText = @"SELECT COUNT({0})
                            FROM   (
                                     {1}
                                   ) __QueryCountTable";

    queryCountText = string.Format(queryCountText, fieldName, commandText);

    // Return
    return queryCountText;
}

封裝為擴充方法

為了更方便開發人員使用GetQueryCountText方法,可以將這個方法近一步封裝成為SqlCommand類別的擴充方法:ExecuteQueryCount方法,讓資料總筆數查詢功能偽裝成為SqlCommand類別的方法。後續開發人員只要建立SQL查詢指令,並且執行ExecuteQueryCount方法,就能夠很快速的在系統中提供資料總筆數查詢的功能。

using (SqlCommand command = new SqlCommand())
{
    // Connection
    command.Connection = connection;

    // CommandText
    command.CommandText = @"SELECT Id, Name FROM Users";

    // Execute
    count = command.ExecuteQueryCount();
}

封裝為擴充方法01

public static int ExecuteQueryCount(this SqlCommand command, string fieldName = "*")
{
    #region Contracts

    if (command == null) throw new ArgumentNullException();
    if (string.IsNullOrEmpty(fieldName) == true) throw new ArgumentNullException();

    #endregion

    // QueryCountText
    var queryCountText = GetQueryCountText(command.CommandText, fieldName);

    // ExecuteQueryCount
    var commandText = command.CommandText;
    try
    {
        // Set
        command.CommandText = queryCountText;

        // Execute
        return Convert.ToInt32(command.ExecuteScalar());
    }
    finally
    {
        // Reset
        command.CommandText = commandText;
    }
}
期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。