[.NET] SQL数据分页查询

程序下载

范例下载:点此下载

原始码下载:点此下载

NuGet封装:点此下载

数据查询

开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据。

SELECT Id, Name FROM Users

数据分页查询

当数据量过多时,系统会需要采用分页的方式来分批取得数据。这时可以改写原有的SQL查询指令,在其中加入ROW_NUMBER(),来为每笔资料打上编号。后续依照系统需求,取得某个编号范围内的数据,就完成在系统中提供数据分页查询的功能。(MS SQL 2012之后的SQL版本,改用OFFSET - FETCH会更简洁。)

SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY Id ASC) __RowNumber,
Id, Name
FROM Users
) __RowNumberTable
WHERE __RowNumberTable.__RowNumber BETWEEN @__StartRowNumber AND @__EndRowNumber

提取为共享方法

上述这个改写SQL查询指令的动作,是很机械化的固定动作,透过抽取其中的动作流程,可以建立一个共享方法:GetLimitText方法。透过这个GetLimitText方法,开发人员传入查询的SQL查询指令,GetLimitText方法就会改写这个SQL查询指令,回传一个提供数据分页查询的SQL分页查询指令。开发人员使用C#来执行这个SQL分页查询指令,就能在系统中提供数据分页查询的功能。

using (SqlCommand command = new SqlCommand())
{
// Connection
command.Connection = connection; // CommandParameters
command.Parameters.Add(new SqlParameter("@__StartRowNumber", index + 1));
command.Parameters.Add(new SqlParameter("@__EndRowNumber", index + count)); // CommandText
command.CommandText = @"SELECT Id, Name FROM Users"; // LimitText
command.CommandText = SqlCommandExtensions.GetLimitText(command.CommandText, "Id ASC"); // Create
using (SqlDataReader reader = command.ExecuteReader())
{
dataTable.Load(reader);
}
}

public static string GetLimitText(string commandText, string orderbyText)
{
#region Contracts if (string.IsNullOrEmpty(commandText) == true) throw new ArgumentNullException();
if (string.IsNullOrEmpty(orderbyText) == true) throw new ArgumentNullException(); #endregion // Remove "SELECT"
commandText = commandText.Trim().Remove(0, 6); // LimitText
var limitText = @"SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY {0}) __RowNumber, {1}
) __RowNumberTable
WHERE __RowNumberTable.__RowNumber BETWEEN @__StartRowNumber AND @__EndRowNumber"; limitText = string.Format(limitText, orderbyText, commandText); // Return
return limitText;
}

封装为扩充方法

为了更方便开发人员使用GetLimitText方法,可以将这个方法近一步封装成为SqlCommand类别的扩充方法:ExecuteReader方法,让数据分页查询功能伪装成为SqlCommand类别的方法。后续开发人员只要建立SQL查询指令,并且执行ExecuteReader方法,就能够很快速的在系统中提供数据分页查询的功能。

using (SqlCommand command = new SqlCommand())
{
// Connection
command.Connection = connection; // CommandText
command.CommandText = @"SELECT Id, Name FROM Users"; // Create
using (SqlDataReader reader = command.ExecuteReader(index, count, "Id ASC"))
{
dataTable.Load(reader);
}
}

public static SqlDataReader ExecuteReader(this SqlCommand command, int index, int count, string orderbyText)
{
#region Contracts if (command == null) throw new ArgumentNullException();
if (string.IsNullOrEmpty(orderbyText) == true) throw new ArgumentNullException(); #endregion // CommandParameters
command.Parameters.Add(new SqlParameter("@__StartRowNumber", index + 1));
command.Parameters.Add(new SqlParameter("@__EndRowNumber", index + count)); // LimitText
var limitText = GetLimitText(command.CommandText, orderbyText); // ExecuteReader
var commandText = command.CommandText;
try
{
// Set
command.CommandText = limitText; // Execute
return command.ExecuteReader();
}
finally
{
// Reset
command.CommandText = commandText;
}
}

[.NET] SQL数据分页查询的更多相关文章

  1. SQL 数据分页查询

    最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...

  2. SQL Server 数据分页查询

    最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...

  3. Oracle、MySql、SQLServer 数据分页查询

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

  4. Oracle/MySql/SQL Sqlserver分页查询

    简述 简单概括一下Oracle,MySql,SQL Sqlserver这三个数据库的分页查询语句. Oracle分页查询 例:每页显示两条数据,现在要查询第二页,也就是第3-4条数据. 查询语句: s ...

  5. 转Oracle、MySql、SQLServer 数据分页查询

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

  6. Oracle、MySql、SQLServer数据分页查询

    看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: 别名.字段 FROM( SELECT row_nu ...

  7. oracle (6)---SQL 数据关联查询

    SQL 数据关联查询 Structure Query Language 从多(n)张表查询对应记录信息,必须有至少n-1个关联条件,否则会出现笛卡尔积的情况.1. 等值连接:没有连接关系的数据不会被查 ...

  8. SQL Server分页查询方法整理

    SQL Server数据库分页查询一直是SQL Server的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页 ...

  9. sql server分页查询

    1.引言 在列表查询时由于数据量非常多,一次性查出来会非常慢,就算一次查出来了,也不能一次性显示给客户端,所以要把数据进行分批查询出来,每页显示一定量的数据,这就是数据要分页. 2.常用的数据分页方法 ...

随机推荐

  1. Eplan 2D安装版布局,部件、端子竖放

    部件竖放,不是通过变量的选择实现,而是通过设置实现的,具体设置在: 选项-设置-用户-2D安装板布局: 部件方向-更改为 垂直 部件放置-旋转角度-更改为90° 这样在连续放置部件的时候就变为竖放了, ...

  2. vbox导入虚拟电脑网卡MAC问题

    vbox导入虚拟电脑之后,需要"重新初始化所有网卡的MAC地址". centos需要做以下几步操作: 1.删除文件"/etc/udev/rules.d/70-persis ...

  3. 【转载】div层调整zindex属性无效原因分析及解决方法

    在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效.在CSS中,只能通过代码改变层级,这个属性就是z-index,要让z-index起作用有个小小前提,就是元素的pos ...

  4. 如何克隆kvm虚拟机

    关于如何使用kvm虚拟化技术创建虚拟机,这里有一系列博客讲的已经非常清楚了,这里不再赘述,不过其中有些小坑可能需要大家注意: 0. 写在创建虚拟机之前(即教程的系列三之前) 1. 确认防火墙是否关闭, ...

  5. [Python] Interpreter setting in Pycharm

    From: http://blog.csdn.net/u013088062/article/details/50135135 From: http://blog.csdn.net/u013088062 ...

  6. SQL中的连接查询及其优化原则

    连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在.最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下. 具体示例请参考:http://www ...

  7. IOS开发UI基础storyboard相关概念的认识

    本文主要介绍一些基本的概念 为后面的学习做个准备 需要了解的知识点有以下几个方面: storyboard文件的认识 IBAction 和IBOutlet UIViewController控制器的认识 ...

  8. Qt之QAbstractItemView视图项拖拽(一)

    一.需求说明 最近在搞视图项的拖拽,也上网查了一些资料,好多的文档都是一样的,只是被不通的网站所收录了(也有可能是被爬过去的,不明所以),不过也有一些文档写的不错,不过就是太简易,都是点睛之笔,总之功 ...

  9. Jquery核心函数

    在Jquery中,所有的DOM对象都将封装成Jquery对象,而且只有Jquery对象才能使用Jquery方法或者属性来执行相应的操作. 所以Jquery提供了一个可以将DOM对象封装成Jquery对 ...

  10. Windows 8.1 去掉库的方法

    Windows 8.1[这台电脑],  里面又多了[文件夹]分类,真是各种不习惯 删除方法: 打开注册表, 找到 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wind ...