首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ASP.NET 呼叫 SQL 分頁預存程序完整實作:通用分頁元件與前端綁定範例

     編輯:關於SqlServer

預存程序:P_viewPage 通用分頁邏輯

支援功能:單表/多表聯結、多欄位排序、三種排序模式、總筆數/總頁數輸出、動態 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

SQL Server 測試呼叫


DECLARE @TotalCount INT, @TotalPageCount INT;
EXEC P_viewPage 'T_Module', '*', 'ModuleID', '', '', 1, 0, 10, 1, @TotalCount OUTPUT, @TotalPageCount OUTPUT;
SELECT @TotalCount, @TotalPageCount;

ASP.NET 資料存取層封裝

通用執行方法


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

優化建議與現代化替代方案

  1. 參數化防注入:預存程序動態 SQL 使用 sp_executesql 參數化,避免字串拼接風險
  2. SQL 2012+ 改用 OFFSET-FETCH:簡化邏輯、提升效能、避免動態 SQL
  3. Entity Framework / Dapper:ORM 內建分頁支援,減少手寫 SQL
  4. 快取總筆數:高頻查詢可快取 @TotalCount 減少 COUNT(*) 開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved