Язык программирования C#9 и платформа .NET5
: $"{myDataReader.GetName(i)} = {myDataReader.GetValue(i)} ");}Console.WriteLine();}Console.WriteLine();} while (myDataReader.NextResult());К этому моменту вы уже должны лучше понимать функциональность, предлагаемую объектами чтения данных. Не забывайте, что объект чтения данных способен обрабатывать только SQL-операторы
; его нельзя применять для изменения существующей таблицы базы данных с использованием запросовSelect,InsertилиUpdate. Модификация существующей базы данных требует дальнейшего исследования объектов команд.DeleteРабота с запросами создания обновления и удаления
Метод
извлекает объект чтения данных, который позволяет просматривать результаты SQL-оператора Select с помощью потока информации, допускающего только чтение в прямом направлении. Однако если необходимо отправить операторы SQL, которые в итоге модифицируют таблицу данных (или любой другой отличающийся от запроса оператор SQL, такой как создание таблицы либо выдача разрешений), то потребуется вызов методаExecuteReader()объекта команды. В зависимости от формата текста команды указанный единственный метод выполняет вставки, обновления и удаления.ExecuteNonQuery()На заметку! Говоря формально, "отличающийся от запроса" означает оператор SQL, который не возвращает результирующий набор. Таким образом, операторы Select являются запросами, тогда как
,InsertиUpdate— нет. С учетом сказанного методDeleteвозвращает значениеExecuteNonQuery(), которое представляет количество строк, затронутых операторами, а не новый набор записей.intВсе примеры взаимодействия с базами данных, рассмотренные в настоящей главе до сих пор, располагали только открытыми подключениями и применяли их для извлечения данных. Это лишь одна часть работы с базами данных; инфраструктура доступа к данным не приносила бы так много пользы, если бы полностью не поддерживала также функциональность создания, чтения, обновления и удаления (
,create,read,update— CRUD). Далее вы научитесь пользоваться такой функциональностью, применяя вызовыdelete.ExecuteNonQuery()Начните с создания нового проекта библиотеки классов C# по имени
(сокращение от AutoLot Data Access Layer — уровень доступа к даннымAutoLot.DAL), удалите стандартный файл класса и добавьте в проект пакетAutoLot.Microsoft.Data.SqlClientПеред построением класса, который будет управлять операциями с данными, сначала понадобится создать класс С#, представляющий запись из таблицы
со связанной информацией Make.InventoryСоздание классов Car и CarViewModel
В современных библиотеках доступа к данным применяются классы (обычно называемые моделями или сущностями), которые используются для представления и транспортировки данных из базы данных. Кроме того, классы могут применяться для представления данных, которое объединяет две и большее количество таблиц, делая данные более значимыми. Сущностные классы используются при работе с каталогом базы данных (для операторов обновления), а классы модели представления применяются для отображения данных в осмысленной манере. В следующей главе вы увидите, что такие концепции являются основой инфраструктур объектно-реляционного отображения (object relational mapping — ORM) вроде Entity Framework Core, но пока вы просто собираетесь создать одну модель (для низкоуровневой строки хранилища) и одну модель представления (объединяющую строку хранилища и связанные данные в таблице
). Добавьте в проект новую папку по имениMakesи поместите в нее два файла,ModelsиCar.cs, со следующим кодом:CarViewModel.cs// Car.csnamespace AutoLot.Dal.Models{public class Car{public int Id { get; set; }public string Color { get; set; }public int MakeId { get; set; }public string PetName { get; set; }public byte[] TimeStamp {get;set;}}}// CarViewModel.csnamespace AutoLot.Dal.Models{public class CarViewModel : Car{public string Make { get; set; }}}На заметку! Если вы не знакомы с типом данных
в SQL Server (который отображается наTimeStampв С#), то беспокоиться об этом не стоит. Просто знайте, что он используется для проверки параллелизма на уровне строк и раскрывается вместе с Entity Framework Core.byte[]Новые классы будут применяться вскоре.
Добавление класса InventoryDal
Далее добавьте новую папку по имени
. Поместите в нее файл класса по имениDataOperationsи измените класс наInventoryDal.cs. В этом классе будут определены разнообразные члены, предназначенные для взаимодействия с таблицейpublicбазы данныхInventory. Наконец, импортируйте следующие пространства имен:AutoLotusing System;using System.Collections.Generic;using System.Data;using AutoLot.Dal.Models;using Microsoft.Data.SqlClient;Добавление конструкторов
Создайте конструктор, который принимает строковый параметр (
) и присваивает его значение переменой уровня класса. Затем создайте конструктор без параметров, передающий стандартную строку подключения другому конструктору В итоге вызывающий код получит возможность изменения строки подключения, если стандартный вариант не подходит. Ниже показан соответствующий код:connectionString