• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 在ASP.NET 2.0中操作数据之二十六:排序自定义分页数据

在ASP.NET 2.0中操作数据之二十六:排序自定义分页数据

作者:heker2007 字体:[增加 减小] 来源:互联网 时间:2017-05-11

heker2007通过本文主要向大家介绍了自定义控件 asp.net,自定义表单 asp.net,asp.net,asp net培训,asp和asp.net的区别等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

导言

  和默认翻页方式相比,自定义分页能提高几个数量级的效率。当我们的需要对大量数据分页的时候就需要考虑自定义分页,然而实现自定义分页相比默认分页需要做更多工作。对于排序自定义分页数据也是这样,在本教程中我们就会扩展前面的例子来实现自定义分页数据的排序。

  注意:既然本教程是基于前一个的,因此我们需要把前面教程示例页面EfficientPaging.aspx的<asp:Content>元素中的代码复制到本教程SortParameter.aspx示例页面中。关于如何进行这样的复制操作请参看为删除数据添加客户端确认

Step 1: 回顾自定义分页技术

  要实现自定义分页,我们需要使用一些方法根据开始行索引和最大行参数返回一个记录的子集。在前面的教程中,我们看了如何使用微软SQL SERVER 2005的ROW_NUMBER()来实现。简而言之,ROW_NUMBER()为每一个查询返回的行分配一个行号。下面这个查询演示了如何使用这个技术按照ProductName排序获取的11至20的产品数据。

SELECT ProductID, ProductName, ...
FROM
 (SELECT ProductID, ProductName, ..., ROW_NUMBER() OVER
  (ORDER BY ProductName) AS RowRank
 FROM Products) AS ProductsWithRowNumbers
WHERE RowRank > 10 AND RowRank <= 20

</div>

  对于按照一种固定的排序规则进行分页,上述技术就能满足了(比如按照ProductName排序),但是如果我们希望获取按照不同的排序表达式排序后的记录,理想地,我们应该在OVER子句中使用参数重写上述查询,代码如下:

SELECT ProductID, ProductName, ...
FROM
 (SELECT ProductID, ProductName, ..., ROW_NUMBER() OVER
  (ORDER BY @sortExpression) AS RowRank
 FROM Products) AS ProductsWithRowNumbers
WHERE RowRank > 10 AND RowRank <= 20

</div>

  可惜,ORDER BY子句中不能使用参数。而我们只能创建存储过程来接受@sortExpression输入参数,使用如下任意一种方法:

  为所有的排序表达式硬编码查询,使用IF/ELSE T-SQL语句来决定执行哪个查询
使用CASE语句来根据输入参数@sortExpression实现动态ORDER BY表达式,详细请看The Power of SQL CASE Statements中的Used to Dynamically Sort Query Results部分。

  使用字符串来保存查询语句然后使用sp_executesql系统存储过程来动态执行查询

  上述每一种实现方法都有各自的缺点。第一个方案和其余两个相比可维护性比较差,因为它需要为每一个可能的查新表达式创建一句查询。因此,如果你又在GridView中加入了一个允许排序的字段,还需要去修改存储过程。对于第二个方案如果我们的数据库列不是字符串类型的话,排序就会引发一定的效率问题,而且可维护性和第一种一个一样也不是很好。至于最后一个动态组合SQL语句的方案,如果你允许用户自己输入参数并传入存储过程的话则可能带来SQL注入攻击的危害。

  虽然没有一种方案是完美的,但是我认识第三种是这三个方案中最佳的。因为它是使用动态SQL语句的,所以灵活性比前两者都好。而且,只有当攻击者能随意把参数传入存储过程才能进行SQL注入攻击。既然DAL使用参数化查询,ADO.NET会防止这些恶意参数传入数据库,也就是说只有当攻击者人直接执行存储过程的时候才会有SQL注入的隐患。

  要实现这个功能,让我们在Northwind数据库中新建称作GetProductsPagedAndSorted的一个存储过程。这个存储过程接受三个参数:@sortExpression,nvarchar(100)类型的输入参数,用来指定排序方式,它会直接拼接在ORDER BY子句后面。@startRowIndex 和 @maximumRows都是整数输入参数,和前面教程中的一样。你可以参考下面的脚本建立GetProductsPagedAndSorted存储过程:

CREATE PROCEDURE dbo.GetProductsPagedAndSorted
(
 @sortExpression nvarchar(100),
 @startRowIndex int,
 @maximumRows int
)
AS
-- Make sure a @sortExpression is specified
IF LEN(@sortExpression) = 0
 SET @sortExpression = 'ProductID'
-- Issue query
DECLARE @sql nvarchar(4000)
SET @sql = 'SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit,
   UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
   CategoryName, SupplierName
   FROM (SELECT ProductID, ProductName, p.SupplierID, p.CategoryID,
     QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
     ReorderLevel, Discontinued,
     c.CategoryName, s.CompanyName AS SupplierName,
     ROW_NUMBER() OVER (ORDER BY ' + @sortExpression + ') AS RowRank
   FROM Products AS p
     INNER JOIN Categories AS c ON
      c.CategoryID = p.CategoryID
     INNER JOIN Suppliers AS s ON
      s.SupplierID = p.SupplierID) AS ProductsWithRowNumbers
   WHERE  RowRank > ' + CONVERT(nvarchar(10), @startRowIndex) +
    ' AND RowRank <= (' + CONVERT(nvarchar(10), @startRowIndex) + ' + '
    + CONVERT(nvarchar(10), @maximumRows) + ')'
-- Execute the SQL query
EXEC sp_executesql @sql

</div>

  存储过程一开始先确保@sortExpression参数的值已经被指定。如果未被指定则按照ProductID排序。接下来,开始构建动态的SQL查询。注意到,在这里的动态SQL查询和前面的用来从Products表获取所有行的查询有些不同。在前面的例子中,我们使用子查询获取每一个产品关联的分类和供应商名。在GetProductsPagedAndSorted中我们只能使用JOINS因为结果需要根据分类或者供应商名来排序。

  我们通过连接静态的查询语句和@sortExpression, @startRowIndex, @maximumRows参数来组成动态查询。因为@startRowIndex和@maximumRows是整数参数,所以必须在连接前把它们转化为nvarchar类型。在动态SQL查询连接完毕后就可以使用sp_executesql来执行。

  先来花一些时间使用各种@sortExpression、@startRowIndex和@maximumRows参数的值来测试存储过程。在服务器资源管理器中右键点击存储过程然后选择执行。IDE会启动运行存储过程对话框,我们输入各种输入参数(见图1)。比如,要让结果按照分类名排序,就把@sortExpression参数的值设置为CategoryName;如果要按照公司名排序就用CompanyName。所有参数的值都正确设置后点击OK。结果就会在输出窗口中显示。图2显示了按照UnitPrice倒序,从11到20的记录。

http://files.weikejianghu.com/file_images/article/201605/20160507173905173.png

图1:试着设置存储过程的三个输入参数

http://files.weikejianghu.com/file_images/article/201605/20160507173906174.png

图2:存储过程的结果显示在了输入窗口中

Step 2: 添加数据访问和业务逻辑层

既然我们已经建立了GetProductsPagedAndSorted存储过程,下一步就是要通过我们的应用程序构架来执行它。我们需要为DAL和BLL添加一个正确的方法。首先让我们为DAL添加一个方法。打开Northwind.xsd强类型DataSet,右键点击ProductsTableAdapter,从菜单中选择添加查询选项。和前面教程中做的一样,我们需要配置一个新的DAL方法来使用建立的存储过程-GetProductsPagedAndSorted。选择使用已有存储过程选项。

http://files.weikejianghu.com/file_images/article/201605/20160507173906175.png

图3:选择一个已有的存储过程

在下一步中,我们通过从下拉列表中选择GetProductsPagedAndSorted存储过程来使用它。

http://files.weikejianghu.com/file_images/article/201605/20160507173906176.png

图4:使用GetProductsPagedAndSorted存储过程

在下一屏幕中,我们选择它返回表格信息。

http://files.weikejianghu.com/file_images/article/201605/20160507173906177.png

图5:指示存储过程返回表格信息

最后,我们创建DAL方法来填充DataTable和返回DataTable,分别命名为FillPagedAndSorted和GetProductsPagedAndSorted。

http://files.weikejianghu.com/file_images/article/201605/20160507173906178.png

图6:选择方法名

现在,我们已经扩展了DAL,让我们来看看BLL吧。打开ProductsBLL类文件并且新增一个方法GetProductsPagedAndSorted。这个方法接受三个参数-sortExpression,startRowIndex和maximumRows。仅仅是简单地调用DAL的GetProductsPagedAndSorted方法,

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • asp.net webform自定义分页控件
  • asp.net DataTable导出Excel自定义列名的方法
  • Asp.net自定义控件之单选、多选控件
  • Asp.net自定义控件之加载层
  • 在ASP.NET 2.0中操作数据之二十六:排序自定义分页数据
  • 在ASP.NET 2.0中操作数据之十一:基于数据的自定义格式化
  • ASP.NET预定义模板介绍
  • ASP.NET中保护自定义的服务器控件
  • ASP.NET通过自定义函数实现对字符串的大小写切换功能
  • asp.net自定义控件中注册Javascript问题解决方案

相关文章

  • 2017-05-11Asp.net 页面调用javascript变量的值
  • 2017-05-11ASP.NET中的DataGridView绑定数据和选中行删除功能具体实例
  • 2017-05-11ASP.NET防止SQL注入的方法示例
  • 2017-05-11asp.net mvc路由篇 如何找到 IHttpHandler方法介绍
  • 2017-05-11asp.net得到本地电脑基本信息的简单方法
  • 2017-05-11详解ASP.NET Core Token认证
  • 2017-05-11.net邮箱发布邮箱信息的实例
  • 2017-05-11在ASP.NET 2.0中操作数据之五十二:使用FileUpload上传文件
  • 2017-05-11不使用web服务(Service)实现文本框自动完成扩展
  • 2017-05-11从客户端检测到有潜在危险的Request.Form值的asp.net代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • asp.net url重写的好处与方法
    • ASP.NET笔记之 Httphandler的操作详解
    • C# 递归函数详细介绍及使用方法
    • ASP.NET对大文件上传的解决方案
    • asp.net(C#)跨域及跨域写Cookie问题
    • asp.net中GridView控件遍历的小例子
    • C#编码好习惯小结
    • 一步步教你读懂NET中IL(图文详解)
    • Repeater与ListView功能概述及使用介绍
    • ASP.NET 多次提交的解决办法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有