范例下載:點此下載
原始碼下載:點此下載
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; }}新聞熱點
疑難解答