[.NET] SQL数据分页查询

news/2024/7/17 2:35:06 标签: c#, 数据库

[.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);
    }
}

提取为共享方法01

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);
    }
}

封装为扩充方法01

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;
    }
}

转载于:https://www.cnblogs.com/clark159/p/3763557.html


http://www.niftyadmin.cn/n/1069291.html

相关文章

Python3 下载相关

官网:https://www.python.org/ 下载地址:https://www.python.org/downloads/ 第三方库:https://pypi.org/ 官方文档:https://docs.python.org/3.8/ 中文文档:https://docs.python.org/zh-cn/3.7/ Awesome Python &a…

ubuntu分辨率解决方法

ubuntu分辨率解决方法 sudo vi /etc/X11/xorg.conf登录界面分辨率ubuntu8.04系统升级后,重启之后,发现登录界面分辨率给改变了,导致登录界面只在显示器上显示出来了一部分。就像一个4寸的相框装了一个五寸的照片,可通过修改/etc/X…

java模式之工厂模式

package com.mode.factory; /** *工厂模式,我再刚刚接触这个模式的时候很纳闷,这样不是很复杂了吗?而且有很多限制。 *其实工厂模式是用在比如数据库连接之类的地方的,生产出来的产品都是一样的,就是有个产品的父类&am…

Python3 Windows下安装(Anaconda3)

anaconda 安装 ,提供Python 科学计算环境,自带Python及常用的库,配置环境方式简便(常用)下载安装包安装,标准方式 Anaconda安装 下载地址:https://anaconda.en.softonic.com/ 或者 链接&…

etc下网络配置文件详解

etc下网络配置文件详解 3.1 /etc/hosts#/etc/hosts#文件格式: IPaddress hostname aliases#文件功能: 提供主机名到IP地址的对应关系,建议将自己经常使用的主机# 加入此文件中,也可将没有DNS记录的机器加入到此文件中,# 这样会方便网络应用1…

Javascript的数学函数

在JavaScript中,数学方法可以分成以下几类:constans(常数)、power functions(乘方函数)、trigonometic functions(三角函数)、rounding functions(舍入函数)以…

VCC、VDD和VSS三种标号的区别

在电子电路中,常可以看到VCC、VDD和VSS三种不同的符号,它们有什么区别呢? 一、解释 VCC:Ccircuit 表示电路的意思, 即接入电路的电压; VDD:Ddevice 表示器件的意思, 即器件内部的工作电压; …

WEB程序调用客户端程序

最近一个项目中要点击WEB页面上的链接启动自己编写的程序,而且还要接收参数,google了1.5小时,终于初步试验通过了。 尝试google了:web send message windows form, bs call cs program, custom protocol...多个关键字组合&#xf…