Постраничный просмотр в SqlDataAdapter

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

В прошлой теме была рассмотрена загрузка данных через SqlDataAdapter в DataSet с последующим отображением в DataGridView. Однако если в базе данных очень много строк, то для более комфортной работы может потребоваться разбить эти данные на отдельные куски или страницы. Используя DataGridView очень легко сделать постраничный просмотр объект. Для этого определим на форме DataGridView и две кнопки - backButton и nextButton соответственно для перехода назад и вперед.

Затем определим следующий код формы:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace PagingApp
{
    public partial class Form1 : Form
    {
        int pageSize = 5; // размер страницы
        int pageNumber = 0; // текущая страница
        string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
        SqlDataAdapter adapter;
        DataSet ds;
        public Form1()
        {
            InitializeComponent();
            
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.AllowUserToAddRows = false;

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                adapter = new SqlDataAdapter(GetSql(), connection);

                ds = new DataSet();
                adapter.Fill(ds, "Users");
                dataGridView1.DataSource = ds.Tables[0];
                dataGridView1.Columns["Id"].ReadOnly = true;
            }
        }
		// обработчик кнопки Вперед
        private void nextButton_Click(object sender, EventArgs e)
        {
            if (ds.Tables["Users"].Rows.Count < pageSize) return;

            pageNumber++;
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                adapter = new SqlDataAdapter(GetSql(), connection);

                ds.Tables["Users"].Rows.Clear();

                adapter.Fill(ds,"Users");
            }
        }
		// обработчик кнопки Назад
        private void backButton_Click(object sender, EventArgs e)
        {
            if (pageNumber==0) return;
            pageNumber--;
            
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                adapter = new SqlDataAdapter(GetSql(), connection);

                ds.Tables["Users"].Rows.Clear();

                adapter.Fill(ds, "Users");
            }
        }

        private string GetSql()
        {
            return "SELECT * FROM Users ORDER BY Id OFFSET ((" + pageNumber + ") * " + pageSize + ") " +
                "ROWS FETCH NEXT " + pageSize + "ROWS ONLY";
        }
    }
}

Переменная pageSize определяет количество строк на одной странице, а переменная pageNumber будет хранить номер текущей просматриваемой страницы.

Запрос к базе данных будет создаваться с помощью функции GetSql().

В обработчике кнопки Вперед увеличивается текущая страница на единицу и производится запрос. В обработчике кнопки Назад уменьшается счетчик текущей страницы.

Постраничная навигация с MS SQL Server
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850