На заметку! Точка с запятой в начале строки опечаткой не является. В случае использования множества операторов они должны разделяться точками с запятой. И поскольку начальный оператор не содержал точку с запятой, она добавлена здесь в начало второго оператора.

После получения объекта чтения данных можно выполнить проход по каждому результирующему набору, используя метод NextResult(). Обратите внимание, что автоматически возвращается первый результирующий набор. Таким образом, если нужно прочитать все строки каждой таблицы, тогда можно построить следующую конструкцию итерации:

do

{

  while (myDataReader.Read())

  {

    for (int i = 0; i < myDataReader.FieldCount; i++)

    {

      Console.Write(i != myDataReader.FieldCount - 1

        ? $"{myDataReader.GetName(i)} = {myDataReader.GetValue(i)}, "

        : $"{myDataReader.GetName(i)} = {myDataReader.GetValue(i)} ");

    }

    Console.WriteLine();

  }

  Console.WriteLine();

} while (myDataReader.NextResult());

К этому моменту вы уже должны лучше понимать функциональность, предлагаемую объектами чтения данных. Не забывайте, что объект чтения данных способен обрабатывать только SQL-операторы Select; его нельзя применять для изменения существующей таблицы базы данных с использованием запросов Insert, Update или Delete. Модификация существующей базы данных требует дальнейшего исследования объектов команд.

<p id="AutBody_Root846"><strong>Работа с запросами создания обновления и удаления</strong></p>

Метод ExecuteReader() извлекает объект чтения данных, который позволяет просматривать результаты SQL-оператора Select с помощью потока информации, допускающего только чтение в прямом направлении. Однако если необходимо отправить операторы SQL, которые в итоге модифицируют таблицу данных (или любой другой отличающийся от запроса оператор SQL, такой как создание таблицы либо выдача разрешений), то потребуется вызов метода ExecuteNonQuery() объекта команды. В зависимости от формата текста команды указанный единственный метод выполняет вставки, обновления и удаления.

На заметку! Говоря формально, "отличающийся от запроса" означает оператор SQL, который не возвращает результирующий набор. Таким образом, операторы Select являются запросами, тогда как Insert, Update и Delete — нет. С учетом сказанного метод ExecuteNonQuery() возвращает значение int, которое представляет количество строк, затронутых операторами, а не новый набор записей.

Все примеры взаимодействия с базами данных, рассмотренные в настоящей главе до сих пор, располагали только открытыми подключениями и применяли их для извлечения данных. Это лишь одна часть работы с базами данных; инфраструктура доступа к данным не приносила бы так много пользы, если бы полностью не поддерживала также функциональность создания, чтения, обновления и удаления (create, read, update, delete — CRUD). Далее вы научитесь пользоваться такой функциональностью, применяя вызовы ExecuteNonQuery().

Начните с создания нового проекта библиотеки классов C# по имени AutoLot.DAL (сокращение от AutoLot Data Access Layer — уровень доступа к данным AutoLot), удалите стандартный файл класса и добавьте в проект пакет Microsoft.Data.SqlClient.

Перед построением класса, который будет управлять операциями с данными, сначала понадобится создать класс С#, представляющий запись из таблицы Inventory со связанной информацией Make.

<p id="AutBody_Root847"><strong>Создание классов Car и CarViewModel</strong></p>

В современных библиотеках доступа к данным применяются классы (обычно называемые моделями или сущностями), которые используются для представления и транспортировки данных из базы данных. Кроме того, классы могут применяться для представления данных, которое объединяет две и большее количество таблиц, делая данные более значимыми. Сущностные классы используются при работе с каталогом базы данных (для операторов обновления), а классы модели представления применяются для отображения данных в осмысленной манере. В следующей главе вы увидите, что такие концепции являются основой инфраструктур объектно-реляционного отображения (object relational mapping — ORM) вроде Entity Framework Core, но пока вы просто собираетесь создать одну модель (для низкоуровневой строки хранилища) и одну модель представления (объединяющую строку хранилища и связанные данные в таблице Makes). Добавьте в проект новую папку по имени Models и поместите в нее два файла, Car.cs и CarViewModel.cs, со следующим кодом:

// Car.cs

namespace AutoLot.Dal.Models

{

Перейти на страницу:

Похожие книги