Heim Datenbank MySQL-Tutorial GridView自定义分页的四种存储过程

GridView自定义分页的四种存储过程

Jun 07, 2016 pm 05:59 PM
存储过程

首先要说说为什么不用GridView的默认的分页功能,GridView控件并非真正知道如何获得一个新页面,它只是请求绑定的数据源控件返回适合规定页面的行,分页最终是由数据源控件完成。

1. 为什么不使用GridView的默认分页功能

首先要说说为什么不用GridView的默认的分页功能,GridView控件并非真正知道如何获得一个新页面,它只是请求绑定的数据源控件返回适合规定页面的行,分页最终是由数据源控件完成。当我们使用SqlDataSource或使用以上的代码处理分页时。每次这个页面被请求或者回发时,所有和这个SELECT语句匹配的记录都被读取并存储到一个内部的DataSet中,但只显示适合当前页面大小的记录数。也就是说有可能使用Select语句返回1000000条记录,而每次回发只显示10条记录。如果启用了SqlDataSource上的缓存,通过把EnableCaching设置为true,则情况会更好一些。在这种情况下,我们只须访问一次数据库服务器,整个数据集只加载一次,并在指定的期限内存储在ASP.NET缓存中。只要数据保持缓存状态,显示任何页面将无须再次访问数据库服务器。然而,可能有大量数据存储在内存中,换而言之,Web服务器的压力大大的增加了。因此,如果要使用SqlDataSource来获取较小的数据时,GridView内建的自动分页可能足够高效了,但对于大数据量来说是不合适的。

2. 分页的四种存储过程(分页+排序的版本请参考Blog里其他文章)

在大多数情况下我们使用存储过程来进行分页,今天有空总结了一下使用存储过程对GridView进行分页的4种写法(分别是使用Top关键字,临时表,临时表变量和SQL Server 2005 新加的Row_Number()函数)

后续的文章中还将涉及GridView控件使用ObjectDataSource自定义分页 + 排序,Repeater控件自定义分页 + 排序,有兴趣的朋友可以参考。
代码如下:
if exists(select 1 from sys.objects where name = 'GetProductsCount' and type = 'P')
drop proc GetProductsCount
go
CREATE PROCEDURE GetProductsCount
as
select count(*) from products
go

--1.使用Top
if exists(select 1 from sys.objects where name = 'GetProductsByPage' and type = 'P')
drop proc GetProductsByPage
go
CREATE PROCEDURE GetProductsByPage
@PageNumber int,
@PageSize int
AS
declare @sql nvarchar(4000)
set @sql = 'select top ' + Convert(varchar, @PageSize)
+ ' * from products where productid not in (select top ' + Convert(varchar, (@PageNumber - 1) * @PageSize) + ' productid from products)'
exec sp_executesql @sql
go

--exec GetProductsByPage 1, 10
--exec GetProductsByPage 5, 10

--2.使用临时表
if exists(select 1 from sys.objects where name = 'GetProductsByPage' and type = 'P')
drop proc GetProductsByPage
go
CREATE PROCEDURE GetProductsByPage
@PageNumber int,
@PageSize int
AS
-- 创建临时表
CREATE TABLE #TempProducts
(
ID int IDENTITY PRIMARY KEY,
ProductID int,
ProductName varchar(40) ,
SupplierID int,
CategoryID int,
QuantityPerUnit nvarchar(20),
UnitPrice money,
UnitsInStock smallint,
UnitsOnOrder smallint,
ReorderLevel smallint,
Discontinued bit
)
-- 填充临时表
INSERT INTO #TempProducts
(ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued
FROM Products

DECLARE @FromID int
DECLARE @ToID int
SET @FromID = ((@PageNumber - 1) * @PageSize) + 1
SET @ToID = @PageNumber * @PageSize

SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued
FROM #TempProducts
WHERE ID >= @FromID AND ID go

--exec GetProductsByPage 1, 10
--exec GetProductsByPage 5, 10

--3.使用表变量
/*
为要分页的数据创建一个table变量,这个table变量里有一个作为主健的IDENTITY列.这样需要分页的每条记录在table变量里就和一个row index(通过IDENTITY列)关联起来了.一旦table变量产生,连接数据库表的SELECT语句就被执行,获取需要的记录.SET ROWCOUNT用来限制放到table变量里的记录的数量.
当SET ROWCOUNT的值指定为PageNumber * PageSize时,这个方法的效率取决于被请求的页数.对于比较前面的页来说– 比如开始几页的数据– 这种方法非常有效. 但是对接近尾部的页来说,这种方法的效率和默认分页时差不多
*/
if exists(select 1 from sys.objects where name = 'GetProductsByPage' and type = 'P')
drop proc GetProductsByPage
go
CREATE PROCEDURE GetProductsByPage
@PageNumber int,
@PageSize int
AS
DECLARE @TempProducts TABLE
(
ID int IDENTITY,
productid int
)
DECLARE @maxRows int
SET @maxRows = @PageNumber * @PageSize
--在返回指定的行数之后停止处理查询
SET ROWCOUNT @maxRows

INSERT INTO @TempProducts (productid)
SELECT productid
FROM products
ORDER BY productid

SET ROWCOUNT @PageSize

SELECT p.*
FROM @TempProducts t INNER JOIN products p
ON t.productid = p.productid
WHERE ID > (@PageNumber - 1) * @PageSize
SET ROWCOUNT 0
GO

--exec GetProductsByPage 1, 10
--exec GetProductsByPage 5, 10

--4.使用row_number函数
--SQL Server 2005的新特性,它可以将记录根据一定的顺序排列,每条记录和一个等级相关 这个等级可以用来作为每条记录的row index.
if exists(select 1 from sys.objects where name = 'GetProductsByPage' and type = 'P')
drop proc GetProductsByPage
go
CREATE PROCEDURE GetProductsByPage
@PageNumber int,
@PageSize int
AS
select ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued
from
(select row_number() Over (order by productid) as row,ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued
from products) as ProductsWithRowNumber
where row between (@PageNumber - 1) * @PageSize + 1 and @PageNumber * @PageSize
go

--exec GetProductsByPage 1, 10
--exec GetProductsByPage 5, 10

3. 在GridView中的应用

代码如下:






Paging




|


>>
>|
转到第

























代码如下:






Paging




|


>>
>|
转到第


























代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class GridViewPaging : System.Web.UI.Page
{
//每页显示的最多记录的条数
private int pageSize = 10;
//当前页号
private int currentPageNumber;
//显示数据的总条数
private static int rowCount;
//总页数
private static int pageCount;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);

SqlCommand cmd = new SqlCommand("GetProductsCount", cn);
cmd.CommandType = CommandType.StoredProcedure;
cn.Open();
rowCount = (int)cmd.ExecuteScalar();
cn.Close();
pageCount = (rowCount - 1) / pageSize + 1;
currentPageNumber = 1;
ViewState["currentPageNumber"] = currentPageNumber;
lbtnPrevious.Enabled = false;
lbtnFirst.Enabled = false;

for (int i = 1; i {
dropPage.Items.Add(new ListItem(i.ToString(), i.ToString()));
}
dropPage.SelectedValue = dropPage.Items.FindByValue(currentPageNumber.ToString()).Value;
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
}
}

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
SqlDataSource1.SelectParameters["PageNumber"].DefaultValue = currentPageNumber.ToString();
SqlDataSource1.SelectParameters["PageSize"].DefaultValue = pageSize.ToString();
}

protected void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e)
{
lblMessage.Text = "共找到" + rowCount + "条记录, 当前第" + currentPageNumber + "/" + pageCount + "页";
}

protected void lbtnPage_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "First":
currentPageNumber = 1;
break;
case "Previous":
currentPageNumber = (int)ViewState["currentPageNumber"] - 1 > 1 ? (int)ViewState["currentPageNumber"] - 1 : 1;
break;
case "Next":
currentPageNumber = (int)ViewState["currentPageNumber"] + 1 break;
case "Last":
currentPageNumber = pageCount;
break;
}
dropPage.SelectedValue = dropPage.Items.FindByValue(currentPageNumber.ToString()).Value;
ViewState["currentPageNumber"] = currentPageNumber;
SetButton(currentPageNumber);
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
}

private void SetButton(int currentPageNumber)
{
lbtnFirst.Enabled = currentPageNumber != 1;
lbtnPrevious.Enabled = currentPageNumber != 1;
lbtnNext.Enabled = currentPageNumber != pageCount;
lbtnLast.Enabled = currentPageNumber != pageCount;
}

protected void dropPage_SelectedIndexChanged(object sender, EventArgs e)
{
currentPageNumber = int.Parse(dropPage.SelectedValue);
ViewState["currentPageNumber"] = currentPageNumber;
SetButton(currentPageNumber);
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
}
}

[/code]
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class GridViewPaging : System.Web.UI.Page
{
//每页显示的最多记录的条数
private int pageSize = 10;
//当前页号
private int currentPageNumber;
//显示数据的总条数
private static int rowCount;
//总页数
private static int pageCount;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);

SqlCommand cmd = new SqlCommand("GetProductsCount", cn);
cmd.CommandType = CommandType.StoredProcedure;
cn.Open();
rowCount = (int)cmd.ExecuteScalar();
cn.Close();
pageCount = (rowCount - 1) / pageSize + 1;
currentPageNumber = 1;
ViewState["currentPageNumber"] = currentPageNumber;
lbtnPrevious.Enabled = false;
lbtnFirst.Enabled = false;

for (int i = 1; i {
dropPage.Items.Add(new ListItem(i.ToString(), i.ToString()));
}
dropPage.SelectedValue = dropPage.Items.FindByValue(currentPageNumber.ToString()).Value;
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
}
}

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
SqlDataSource1.SelectParameters["PageNumber"].DefaultValue = currentPageNumber.ToString();
SqlDataSource1.SelectParameters["PageSize"].DefaultValue = pageSize.ToString();
}

protected void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e)
{
lblMessage.Text = "共找到" + rowCount + "条记录, 当前第" + currentPageNumber + "/" + pageCount + "页";
}

protected void lbtnPage_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "First":
currentPageNumber = 1;
break;
case "Previous":
currentPageNumber = (int)ViewState["currentPageNumber"] - 1 > 1 ? (int)ViewState["currentPageNumber"] - 1 : 1;
break;
case "Next":
currentPageNumber = (int)ViewState["currentPageNumber"] + 1 break;
case "Last":
currentPageNumber = pageCount;
break;
}
dropPage.SelectedValue = dropPage.Items.FindByValue(currentPageNumber.ToString()).Value;
ViewState["currentPageNumber"] = currentPageNumber;
SetButton(currentPageNumber);
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
}

private void SetButton(int currentPageNumber)
{
lbtnFirst.Enabled = currentPageNumber != 1;
lbtnPrevious.Enabled = currentPageNumber != 1;
lbtnNext.Enabled = currentPageNumber != pageCount;
lbtnLast.Enabled = currentPageNumber != pageCount;
}

protected void dropPage_SelectedIndexChanged(object sender, EventArgs e)
{
currentPageNumber = int.Parse(dropPage.SelectedValue);
ViewState["currentPageNumber"] = currentPageNumber;
SetButton(currentPageNumber);
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
}
}
[/code]
4.分页效果图:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Schritte und Vorsichtsmaßnahmen für die Implementierung von Batch-Updates mithilfe gespeicherter Oracle-Prozeduren Schritte und Vorsichtsmaßnahmen für die Implementierung von Batch-Updates mithilfe gespeicherter Oracle-Prozeduren Mar 08, 2024 pm 04:12 PM

Titel: Schritte und Vorsichtsmaßnahmen für die Implementierung von Stapelaktualisierungen durch gespeicherte Oracle-Prozeduren. In Oracle-Datenbanken handelt es sich bei gespeicherten Prozeduren um eine Reihe von SQL-Anweisungen, die dazu dienen, die Datenbankleistung zu verbessern, Code wiederzuverwenden und die Sicherheit zu erhöhen. Gespeicherte Prozeduren können zum Aktualisieren von Daten in Stapeln verwendet werden. In diesem Artikel wird erläutert, wie gespeicherte Oracle-Prozeduren zum Implementieren von Batch-Updates verwendet werden, und es werden spezifische Codebeispiele bereitgestellt. Schritt 1: Erstellen Sie eine gespeicherte Prozedur. Zuerst müssen wir eine gespeicherte Prozedur erstellen, um Stapelaktualisierungsvorgänge zu implementieren. Im Folgenden erfahren Sie, wie Sie eine gespeicherte Prozedur erstellen

So löschen Sie eine gespeicherte Prozedur in MySQL So löschen Sie eine gespeicherte Prozedur in MySQL Sep 05, 2023 am 10:25 AM

Zu den MySQL-Methoden zum Löschen gespeicherter Prozeduren gehören die Verwendung der DROP PROCEDURE-Anweisung, die Verwendung von MySQL Workbench und die Verwendung von Befehlszeilentools. Detaillierte Einführung: 1. Verwenden Sie die DROP PROCEDURE-Anweisung. Die Schritte bestehen darin, zuerst den MySQL-Client zu öffnen oder ein beliebiges Tool zu verwenden, das MySQL unterstützt, dann eine Verbindung zu Ihrer MySQL-Datenbank herzustellen und schließlich die folgende SQL-Anweisung auszuführen, um die gespeicherte Prozedur zu löschen. Verwenden Sie MySQL Workbench, um gespeicherte Prozeduren usw. zu löschen.

Gespeicherte Oracle-Prozedur: Implementierungsmethode zur Bestimmung, ob eine Tabelle vorhanden ist Gespeicherte Oracle-Prozedur: Implementierungsmethode zur Bestimmung, ob eine Tabelle vorhanden ist Mar 08, 2024 pm 09:18 PM

Gespeicherte Prozeduren in Oracle-Datenbanken sind eine bestimmte Art von gespeicherten Prozeduren, die zum Ausführen einer Reihe von SQL-Anweisungen und Datenoperationen in der Datenbank verwendet werden. Bei der tatsächlichen Datenbankentwicklung müssen wir manchmal feststellen, ob eine bestimmte Tabelle in der Datenbank vorhanden ist, damit wir im gespeicherten Prozess eine gewisse Beurteilung und logische Verarbeitung vornehmen können. Im Folgenden stellen wir vor, wie Sie die Methode zur Bestimmung, ob eine Tabelle in der Oracle-Datenbank vorhanden ist, implementieren und stellen spezifische Codebeispiele bereit. Erstens können wir die Systemtabelle user_tables oder all_t verwenden

Implementierungsprinzipien und Anwendungen gespeicherter Golang-Prozeduren Implementierungsprinzipien und Anwendungen gespeicherter Golang-Prozeduren Feb 22, 2024 pm 04:57 PM

Implementierungsprinzipien und Anwendungen gespeicherter Golang-Prozeduren Eine gespeicherte Prozedur ist ein vorkompiliertes Programm, das in einer relationalen Datenbank gespeichert ist und von einer Anwendung aufgerufen werden kann. Sie kann die Kosten für die Netzwerkübertragung von Daten effektiv senken und die Ausführungseffizienz der Datenbank verbessern. Obwohl Golang gespeicherte Prozeduren nicht direkt unterstützt, können Sie die Funktionen gespeicherter Prozeduren mithilfe von SQL-Anweisungen simulieren. In diesem Artikel werden die Prinzipien und Anwendungen der Implementierung gespeicherter Prozeduren in Golang vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Das Implementierungsprinzip der gespeicherten Golang-Prozedur ist in Gol

Leistungsoptimierungsstrategie für Oracle Stored Procedure Batch Update Leistungsoptimierungsstrategie für Oracle Stored Procedure Batch Update Mar 08, 2024 pm 09:36 PM

Strategien zur Leistungsoptimierung für Stapelaktualisierungen von gespeicherten Oracle-Prozeduren In Oracle-Datenbanken ist eine gespeicherte Prozedur ein Datenbankobjekt, das zum Verarbeiten von Datenlogik oder zum Ausführen bestimmter Aufgaben verwendet wird. Sie kann bestimmte Strategien zur Leistungsoptimierung bereitstellen, insbesondere bei der Aktualisierung von Daten in Stapeln. Das Aktualisieren von Daten in Stapeln erfordert normalerweise eine große Anzahl von Vorgängen auf Zeilenebene. Um die Leistung und Effizienz zu verbessern, können wir einige Strategien und Techniken anwenden, um die Leistung gespeicherter Prozeduren zu optimieren. Im Folgenden werden einige Strategien zur Leistungsoptimierung für Stapelaktualisierungen gespeicherter Oracle-Prozeduren vorgestellt und spezifische Codebeispiele bereitgestellt.

So schreiben Sie benutzerdefinierte gespeicherte Prozeduren und Funktionen in MySQL mit C# So schreiben Sie benutzerdefinierte gespeicherte Prozeduren und Funktionen in MySQL mit C# Sep 22, 2023 am 09:42 AM

So schreiben Sie benutzerdefinierte gespeicherte Prozeduren und Funktionen in MySQL mit C#. Einführung: MySQL ist ein weit verbreitetes Open-Source-Datenbankverwaltungssystem, und C# ist eine häufig verwendete objektorientierte Programmiersprache. Während des Entwicklungsprozesses müssen wir häufig in Datenbanken gespeicherte Prozeduren und Funktionen verwenden, um die Wiederverwendbarkeit und Leistung des Codes zu verbessern. In diesem Artikel wird erläutert, wie Sie mit C# benutzerdefinierte gespeicherte Prozeduren und Funktionen in einer MySQL-Datenbank schreiben, und es werden spezifische Codebeispiele bereitgestellt. 1. Gespeicherte Prozeduren Eine gespeicherte Prozedur ist eine Reihe von SQL-Anweisungen, die bestimmte Aufgaben ausführen.

Detaillierter Vergleich und Vorteilsanalyse von gespeicherten Oracle-Prozeduren und -Funktionen Detaillierter Vergleich und Vorteilsanalyse von gespeicherten Oracle-Prozeduren und -Funktionen Mar 03, 2024 am 10:24 AM

Titel: Detaillierter Vergleich und Vorteilsanalyse von gespeicherten Oracle-Prozeduren und -Funktionen. In Oracle-Datenbanken sind gespeicherte Prozeduren und Funktionen zwei wichtige Datenbankobjekte. Sie können zur Kapselung einer Reihe von SQL-Anweisungen und Logik verwendet werden, um die Effizienz und Komplexität von Daten zu verbessern Benutzerfreundlichkeit. In diesem Artikel werden die Eigenschaften der gespeicherten Oracle-Prozeduren und -Funktionen sowie ihre jeweiligen Vorteile im Detail verglichen und spezifische Codebeispiele bereitgestellt. Gespeicherte Prozedur Eine gespeicherte Prozedur ist eine Reihe von SQL-Anweisungen und PL/SQL-Codelogik, die vorab geschrieben und in der Datenbank gespeichert werden.

So schreiben Sie benutzerdefinierte Trigger und gespeicherte Prozeduren in MySQL mit PHP So schreiben Sie benutzerdefinierte Trigger und gespeicherte Prozeduren in MySQL mit PHP Sep 20, 2023 am 11:25 AM

So schreiben Sie benutzerdefinierte Trigger und gespeicherte Prozeduren in MySQL mit PHP. Einführung: Bei der Entwicklung von Anwendungen müssen wir häufig einige Vorgänge auf Datenbankebene ausführen, z. B. das Einfügen, Aktualisieren oder Löschen von Daten. MySQL ist ein weit verbreitetes relationales Datenbankverwaltungssystem und PHP ist eine beliebte serverseitige Skriptsprache. In diesem Artikel wird erläutert, wie Sie mit PHP benutzerdefinierte Trigger und gespeicherte Prozeduren in MySQL schreiben, und es werden spezifische Codebeispiele bereitgestellt. 1. Was sind Trigger und gespeicherte Prozedur-Trigger (Trigg

See all articles