Работа с DataSet без базы данных

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

В прошлой теме для получения данных в DataSet приходилось подключаться к БД. Но в реальности DataSet - самодостаточный класс, с которым можно работать без подключения к базе данных, если нам не нужно никакого подключения к БД, не надо загужать данные. Такой сценарий не так сильно распространен и явно требуется не часто, если вообще требуется. Тем не менее рассмотрим, как мы можем работать с объектами DataSet и DataTable без какой-либо базы данных.

Например, создадим вручную в DataSet таблицу, определим ее структуру и добавим в нее данные:

using System;
using System.Data;

namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet usersSet = new DataSet("UsersSet");
            DataTable users = new DataTable("Users");
            // добавляем таблицу в dataset
            usersSet.Tables.Add(users);

            // создаем столбцы для таблицы Users
            DataColumn idColumn = new DataColumn("Id", Type.GetType("System.Int32"));
            idColumn.Unique = true; // столбец будет иметь уникальное значение
            idColumn.AllowDBNull = false; // не может принимать null
            idColumn.AutoIncrement = true; // будет автоинкрементироваться
            idColumn.AutoIncrementSeed = 1; // начальное значение
            idColumn.AutoIncrementStep = 1; // приращении при добавлении новой строки

            DataColumn nameColumn = new DataColumn("Name", Type.GetType("System.String"));
            DataColumn ageColumn = new DataColumn("Age", Type.GetType("System.Int32"));
            ageColumn.DefaultValue = 1; // значение по умолчанию

            users.Columns.Add(idColumn);
            users.Columns.Add(nameColumn);
            users.Columns.Add(ageColumn);
            // определяем первичный ключ таблицы Users
            users.PrimaryKey = new DataColumn[] { users.Columns["Id"] };

            DataRow row = users.NewRow();
            row.ItemArray = new object[] { null, "Tom", 36 };
            users.Rows.Add(row); // добавляем первую строку
            users.Rows.Add(new object[] { null, "Bob", 29 }); // добавляем вторую строку

            Console.Write("Id\t Имя\t Возраст\t");
            Console.WriteLine();
            foreach (DataRow r in users.Rows)
            {
                foreach (var cell in r.ItemArray)
                    Console.Write("{0}\t", cell);
                Console.WriteLine();
            }
            Console.Read();
        }
    }
}

Консольный вывод программы:

Id		Имя		Возраст
1		Tom		36
2		Bob		29

Разберем весь код. Сначала создаются объекты DataSet и DataTable, в конструктор которых передается название. Затем создается три столбца DataColumn. Каждый столбец в конструкторе принимает два параметра: имя столбца и его тип.

DataColumn idColumn = new DataColumn("Id", Type.GetType("System.Int32"));

Причем для столбца Id устанавливается, что значения этого столбца должны иметь уникальное значение, не должны принимать null, и их значение при добавлении нового объекта будет инкрементироваться на единицу. То есть фактически это стандартный столбец Id, как в большинстве баз данных.

Далее создается еще два столбца - nameColumn и ageColumn. Затем устанавливается первичный ключ для таблицы с помощью свойства PrimaryKey:

users.PrimaryKey = new DataColumn[] { users.Columns["Id"] };

В роли первичного ключа выступает столбец Id. Но мы также можем использовать набор различных столбцов для создания составного ключа.

После определения схемы таблицы в нее добавляются две строки:

DataRow row = users.NewRow();
row.ItemArray = new object[] { null, "Tom", 36 };
users.Rows.Add(row); // добавляем первую строку
users.Rows.Add(new object[] { null, "Bob", 29 }); // добавляем вторую строку

Значения в метод users.Rows.Add() можно передать как напрямую в виде массива объектов, так и в виде объекта DataRow. При этом нам надо передать ровно столько значений, сколько в таблице столбцов. Однако поскольку первый столбец Id устанавливается через автоинкремент, мы можем передать значение null - оно все равно будет игнорироваться. Также мы можем опустить значение для третьего столбца - Age, так как у него установлено свойство DefaultValue, которое устанавливает значение по умолчанию, если значение отсутствует:

users.Rows.Add(new object[] { null, "Bob", 29 });

И в конце идет перебор строк таблицы.

Кроме добавления мы можем производить и другие операции со строками. Например, мы можем получить строку по индексу:

DataRow row = users.Rows[0]; // первая строка

Получив строку по индексу, можно изменить ее ячейки. Изменить ячейку можно, используя либо индекс, либо название столбца. Например, изменение третий ячейки (индекс столбца - 2):

users.Rows[0][2] = 30; //третьей ячейке первой строки присваивается значение 30

Или изменение ячейки для столбца с названием "Age":

users.Rows[0]["Age"] = 30;

И также можно удалять строку:

users.Rows.RemoveAt(1); // удаление второй строки по индексу
// другой сопосб удаления
DataRow row = users.Rows[0];
users.Rows.Remove(row);

Используя метод Select() объекта DataTable мы легко можем найти строки, которые соответствуют определенному критерию. Например, получим строки, в которых возраст больше 30:

var selectedUsers = users.Select("Age > 30");
foreach (var user in selectedUsers)
	Console.WriteLine($"{user["Name"]} - {user["Age"]}");
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850