范例下载:点此下载
原始码下载:点此下载
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());}
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();}
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; }}
新闻热点
疑难解答