如何在ASP.NET中实现安全、实用且简单的大容量存储过程分页?

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

如何在ASP.NET中实现安全、实用且简单的大容量存储过程分页?

背景介绍

在现代Web应用程序中,处理大量数据并进行高效分页是一项常见需求,传统的分页方法往往存在性能问题和安全隐患,特别是在面对大数据量时,本文将详细介绍如何在ASP.NET中使用存储过程实现安全、实用且高效的分页功能,并结合具体代码示例进行说明。

章节目录

1、[背景介绍](#背景介绍)

2、[存储过程的优势](#存储过程的优势)

3、[创建分页存储过程](#创建分页存储过程)

4、[在ASP.NET中调用存储过程](#在aspnet中调用存储过程)

5、[分页控件的使用](#分页控件的使用)

6、[完整示例与代码分析](#完整示例与代码分析)

7、[(#

8、[Q&A](#qa-)

存储过程的优势

存储过程是一种在数据库中以预编译的SQL语句***形式存储的程序,具有以下优势:

性能优化: 预编译的SQL语句执行速度更快。

安全性: 通过参数化查询,防止SQL注入攻击。

简化代码维护: SQL逻辑与业务逻辑分离,更容易管理和维护。

如何在ASP.NET中实现安全、实用且简单的大容量存储过程分页?

创建分页存储过程

我们需要在数据库中创建一个存储过程来实现分页功能,以下是一个示例存储过程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)

如何在ASP.NET中实现安全、实用且简单的大容量存储过程分页?

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 安全、实用、简单的大容量存储过程分页”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!