支援功能:單表/多表聯結、多欄位排序、三種排序模式、總筆數/總頁數輸出、動態 WHERE/ORDER BY 建構。
CREATE PROC P_viewPage
@TableName VARCHAR(200), -- 表名(支援聯結語法)
@FieldList VARCHAR(2000), -- 欄位清單,* 表所有
@PrimaryKey VARCHAR(100), -- 單一主鍵/唯一鍵
@Where VARCHAR(2000), -- WHERE 條件(不含 WHERE 關鍵字)
@Order VARCHAR(1000), -- ORDER BY 條件(不含 ORDER BY 關鍵字)
@SortType INT, -- 1:單鍵正序 2:單鍵倒序 3:多欄位排序
@RecorderCount INT, -- 已知總筆數(0=自動查詢)
@PageSize INT, -- 頁大小
@PageIndex INT, -- 當前頁碼
@TotalCount INT OUTPUT, -- 回傳總筆數
@TotalPageCount INT OUTPUT -- 回傳總頁數
AS
-- 完整邏輯見原文,核心採用 TOP + 子查詢邊界定位策略
-- SortType=3 時需在 @Order 末尾包含主鍵
GO
DECLARE @TotalCount INT, @TotalPageCount INT;
EXEC P_viewPage 'T_Module', '*', 'ModuleID', '', '', 1, 0, 10, 1, @TotalCount OUTPUT, @TotalPageCount OUTPUT;
SELECT @TotalCount, @TotalPageCount;
public static DataSet RunProcedureDS(string connectionString, string storedProcName,
IDataParameter[] parameters, string tableName) {
using (SqlConnection conn = new SqlConnection(connectionString)) {
DataSet ds = new DataSet();
conn.Open();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = BuildQueryCommand(conn, storedProcName, parameters);
da.Fill(ds, tableName);
conn.Close();
return ds;
}
}
private static SqlCommand BuildQueryCommand(SqlConnection conn, string procName, IDataParameter[] params) {
SqlCommand cmd = new SqlCommand(procName, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(params);
return cmd;
}
public static DataSet PageList(string connectionString, string tblName, string strGetFields,
string primaryKey, string strWhere, string strOrder, int sortType, int recordCount,
int pageSize, int pageIndex, ref int totalCount, ref int totalPageCount) {
SqlParameter[] parameters = {
new SqlParameter("@TableName", SqlDbType.VarChar, 200) { Value = tblName },
new SqlParameter("@FieldList", SqlDbType.VarChar, 2000) { Value = strGetFields },
new SqlParameter("@PrimaryKey", SqlDbType.VarChar, 100) { Value = primaryKey },
new SqlParameter("@Where", SqlDbType.VarChar, 2000) { Value = strWhere },
new SqlParameter("@Order", SqlDbType.VarChar, 1000) { Value = strOrder },
new SqlParameter("@SortType", SqlDbType.Int) { Value = sortType },
new SqlParameter("@RecorderCount", SqlDbType.Int) { Value = recordCount },
new SqlParameter("@PageSize", SqlDbType.Int) { Value = pageSize },
new SqlParameter("@PageIndex", SqlDbType.Int) { Value = pageIndex },
new SqlParameter("@TotalCount", SqlDbType.Int) { Value = totalCount, Direction = ParameterDirection.Output },
new SqlParameter("@TotalPageCount", SqlDbType.Int) { Value = totalPageCount, Direction = ParameterDirection.Output }
};
DataSet ds = RunProcedureDS(connectionString, "P_viewPage", parameters, "PageListTable");
totalCount = Convert.ToInt32(parameters[9].Value);
totalPageCount = Convert.ToInt32(parameters[10].Value);
return ds;
}
// 程式碼後置
int totalCount = 0, totalPageCount = 0;
int pageSize = 10, pageIndex = 1;
DataSet ds = SqlHelper.PageList(
SqlHelper.LocalSqlServer, "T_User", "*", "UserID", "", "", 1, 0, pageSize, pageIndex,
ref totalCount, ref totalPageCount);
this.RptData.DataSource = ds;
this.RptData.DataBind();
// 前端 .aspx
<%# Eval("UserID") %>
<%# Eval("UserName") %>
<%# Eval("Email") %>
// 參數範例
tblName = "UserInfo u INNER JOIN Department d ON u.DepID = d.ID";
strGetFields = "u.ID AS UserID, u.Name, u.Sex, d.ID AS DepID, d.DeptName";
strOrder = "u.ID,ASC|u.Name,DESC"; // 格式:欄位,排序|欄位,排序
strWhere = "AND u.DepID = 1 AND u.Status = 1"; // 每個條件前必須加 AND
sp_executesql 參數化,避免字串拼接風險@TotalCount 減少 COUNT(*) 開銷