ASP.NET 安全、实用、简单的大容量存储过程分页

背景介绍
在现代Web应用程序中,处理大量数据并进行高效分页是一项常见需求,传统的分页方法往往存在性能问题和安全隐患,特别是在面对大数据量时,本文将详细介绍如何在ASP.NET中使用存储过程实现安全、实用且高效的分页功能,并结合具体代码示例进行说明。
章节目录
1、[背景介绍](#背景介绍)
2、[存储过程的优势](#存储过程的优势)
3、[创建分页存储过程](#创建分页存储过程)
4、[在ASP.NET中调用存储过程](#在aspnet中调用存储过程)
5、[分页控件的使用](#分页控件的使用)
6、[完整示例与代码分析](#完整示例与代码分析)
7、[(#
8、[Q&A](#qa-)
存储过程的优势
存储过程是一种在数据库中以预编译的SQL语句***形式存储的程序,具有以下优势:
性能优化: 预编译的SQL语句执行速度更快。
安全性: 通过参数化查询,防止SQL注入攻击。
简化代码维护: SQL逻辑与业务逻辑分离,更容易管理和维护。

创建分页存储过程
我们需要在数据库中创建一个存储过程来实现分页功能,以下是一个示例存储过程usp_GetPagedData,它接受五个参数:
1、PageIndex: 当前页索引(从0开始)
2、PageSize: 每页显示的记录数
3、TotalCount: 输出参数,返回总记录数
4、UserName: 用户名筛选条件
5、Phone: 电话号码筛选条件
CREATE PROCEDURE usp_GetPagedData
@PageIndex INT,
@PageSize INT,
@TotalCount INT OUTPUT,
@UserName NVARCHAR(32),
@Phone NVARCHAR(16)
AS
BEGIN
DECLARE @Offset INT;
SET @Offset = @PageIndex * @PageSize;
-获取总记录数
SELECT @TotalCount = COUNT(*)
FROM Users
WHERE (@UserName IS NULL OR UserName = @UserName)
AND (@Phone IS NULL OR Phone = @Phone);
-获取分页数据
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY UserID) AS RowNum, *
FROM Users
WHERE (@UserName IS NULL OR UserName = @UserName)
AND (@Phone IS NULL OR Phone = @Phone)
) AS PagedData
WHERE RowNum > @Offset AND RowNum <= @Offset + @PageSize
ORDER BY RowNum;
END
在ASP.NET中调用存储过程
在ASP.NET中,我们可以使用SqlCommand对象来调用存储过程并获取数据,以下是一个完整的示例,包括如何绑定数据到GridView控件并实现分页功能。
1. 前端页面 (Default.aspx)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>分页示例</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging" PageSize="10">
</asp:GridView>
<br />
<asp:TextBox ID="txtPageIndex" runat="server"></asp:TextBox>
<asp:Button ID="btnGo" runat="server" Text="Go" OnClick="btnGo_Click" />
</div>
</form>
</body>
</html>
2. 后端代码 (Default.aspx.cs)
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindData();
}
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
BindData();
}
protected void btnGo_Click(object sender, EventArgs e)
{
int pageIndex;
if (int.TryParse(txtPageIndex.Text, out pageIndex))
{
GridView1.PageIndex = pageIndex;
BindData();
}
}
private void BindData()
{
string connectionString = "your_connection_string_here"; // 替换为你的连接字符串
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("usp_GetPagedData", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@PageIndex", GridView1.PageIndex);
cmd.Parameters.AddWithValue("@PageSize", GridView1.PageSize);
cmd.Parameters.Add(new SqlParameter("@TotalCount", SqlDbType.Int) { Direction = ParameterDirection.Output });
cmd.Parameters.AddWithValue("@UserName", ""); // 根据需要添加筛选条件
cmd.Parameters.AddWithValue("@Phone", ""); // 根据需要添加筛选条件
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
// 设置总记录数
if (cmd.Parameters["@TotalCount"].Value != DBNull.Value)
{
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
}
}
分页控件的使用
上述示例中使用了GridView自带的分页功能,还可以使用第三方控件如aspnetpager实现更灵活的分页,以下是如何使用aspnetpager的简要说明。
安装`aspnetpager`
可以通过NuGet包管理器安装aspnetpager:
Install-Package aspNetPager
2. 前端页面 (Default.aspx)
<%@ Register Assembly="aspNetPager" TagPrefix="asp" %> ... <asp:GridView ID="GridView1" runat="server" AllowPaging="False"> </asp:GridView> <asp:AspNetPager ID="pager" runat="server" AlwaysShow="true" OnPageChanged="pager_PageChanged" ShowCustomInfoSection="true" ShowFirstLastPageButton="true"> </asp:AspNetPager>
3. 后端代码 (Default.aspx.cs)

protected void pager_PageChanged(object src, EventArgs e)
{
GridView1.PageIndex = pager.CurrentPageIndex 1; // 因为GridView的PageIndex是从0开始的
BindData();
}
完整示例与代码分析
以下是一个完整的示例,包括前端页面和后端代码,展示了如何在ASP.NET中调用存储过程实现分页,并结合GridView和aspnetpager控件实现分页功能。
数据库表结构 (`Users`)
假设我们有一个名为Users的表,包含以下列:
UserID (主键)
UserName (用户名)
Phone (电话号码)
Email (电子邮件)
CreatedDate (创建日期)
2. 存储过程 (usp_GetPagedData)
CREATE PROCEDURE usp_GetPagedData
@PageIndex INT,
@PageSize INT,
@TotalCount INT OUTPUT,
@UserName NVARCHAR(32),
@Phone NVARCHAR(16)
AS
BEGIN
DECLARE @Offset INT;
SET @Offset = @PageIndex * @PageSize;
-获取总记录数
SELECT @TotalCount = COUNT(*)
FROM Users
WHERE (@UserName IS NULL OR UserName = @UserName)
AND (@Phone IS NULL OR Phone = @Phone);
-获取分页数据
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY UserID) AS RowNum, *
FROM Users
WHERE (@UserName IS NULL OR UserName = @UserName)
AND (@Phone IS NULL OR Phone = @Phone)
) AS PagedData
WHERE RowNum > @Offset AND RowNum <= @Offset + @PageSize
ORDER BY RowNum;
END
3. 前端页面 (Default.aspx)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<%@ Register Assembly="AspNetPager" TagPrefix="asp" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>分页示例</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AllowPaging="False">
</asp:GridView>
<asp:AspNetPager ID="pager" runat="server" AlwaysShow="true" OnPageChanged="pager_PageChanged" ShowCustomInfoSection="true" ShowFirstLastPageButton="true">
</asp:AspNetPager>
</div>
</form>
</body>
</html>
4. 后端代码 (Default.aspx.cs)
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindData();
}
}
protected void pager_PageChanged(object src, EventArgs e)
{
GridView1.PageIndex = pager.CurrentPageIndex 1; // 因为GridView的PageIndex是从0开始的
BindData();
}
private void BindData()
{
string connectionString = "your_connection_string_here"; // 替换为你的连接字符串
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("usp_GetPagedData", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@PageIndex", GridView1.PageIndex);
cmd.Parameters.AddWithValue("@PageSize", GridView1.PageSize);
cmd.Parameters.Add(new SqlParameter("@TotalCount", SqlDbType.Int) { Direction = ParameterDirection.Output });
cmd.Parameters.AddWithValue("@UserName", ""); // 根据需要添加筛选条件
cmd.Parameters.AddWithValue("@Phone", ""); // 根据需要添加筛选条件
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
// 设置总记录数用于分页控件
if (cmd.Parameters["@TotalCount"].Value != DBNull.Value)
{
pager.TotalRecords = int.Parse(cmd.Parameters["@TotalCount"].Value.ToString());
}
else
{
pager.TotalRecords = 0;
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
}
本文详细介绍了如何在ASP.NET中使用存储过程实现安全、实用且高效的分页功能,通过创建和使用分页存储过程,可以显著提高大数据量下的分页性能,同时保证数据的安全性,结合ASP.NET中的GridView和第三方分页控件如aspnetpager,可以实现灵活且用户友好的分页界面,希望本文对您在实际项目中实现分页功能有所帮助。
以上就是关于“asp.net 安全、实用、简单的大容量存储过程分页”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!