日期:2014-06-10  浏览次数:20523 次

[.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;
    }
}