В прошлой теме для получения данных в 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"]}");