• [.NET] 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;
        }
    }
    
  • 相关阅读:
    ISO9126 软件质量模型
    java 15.String
    java 14. ArrayList常用方法
    java 13. 方法重载构造方法块this用法
    linux ssh连接心跳检查断开连接
    关于递归,我有几句话想说
    pytest 报错 ImportError: cannot import name 'main'
    递归回溯剪枝之斐波那契数列
    appium-doctor诊断信息不完整
    数据驱动,关键字驱动,混合驱动简单模型
  • 原文地址:https://www.cnblogs.com/clark159/p/3764157.html
Copyright © 2020-2023  润新知