Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Color = (string) dataReader["Color"],

Make = (string) dataReader["Make"],

PetName = (string) dataReader["PetName"]

};

}

dataReader.Close;

return car;

}

На заметку! Помещение пользовательского ввода внутрь низкоуровневых операторов SQL, как делалось здесь, обычно считается неудачной практикой. Позже в главе код будет модифицирован для использования параметров.

Вставка

новой записи об автомобиле

Вставка новой записи в таблицу Inventory сводится к построению SQL-оператора

Insert
(на основе пользовательского ввода), открытию подключения, вызову метода
ExecuteNonQuery
с применением объекта команды и закрытию подключения. Увидеть вставку в действии можно, добавив к типу
InventoryDal
открытый метод по имени
InsertAuto
, который принимает три параметра, отображаемые на не связанные с идентичностью столбцы таблицы
Inventory
(
Color
,
Make
и
PetName
). Указанные аргументы используются при форматировании строки для вставки новой записи. И, наконец, для выполнения итогового оператора SQL применяется объект
SqlConnection
.

public void InsertAuto(string color, int makeId, string petName)

{

OpenConnection;

// Сформатировать и выполнить оператор SQL.

string sql = $"Insert Into Inventory (MakeId, Color, PetName) Values ('{makeId}',

'{color}', '{petName}')";

// Выполнить, используя наше подключение.

using (SqlCommand command = new SqlCommand(sql, _sqlConnection))

{

command.CommandType = CommandType.Text;

command.ExecuteNonQuery;

}

CloseConnection;

}

Приведенный выше метод принимает три значения для

Car
и работает при условии, что вызывающий код передает значения в правильном порядке. Более совершенный метод использует
Car
, чтобы стать строго типизированным, гарантируя тем самым, что все свойства передаются методу в корректном порядке.

Создание строго типизированного метода InsertCar

Добавьте в класс

InventoryDal
еще одну версию метода
InsertAuto
, которая принимает в качестве параметра
Car
:

public void InsertAuto(Car car)

{

OpenConnection;

// Сформатировать и выполнить оператор SQL.

string sql = "Insert Into Inventory (MakeId, Color, PetName) Values " +

$"('{car.MakeId}', '{car.Color}', '{car.PetName}')";

// Выполнить, используя наше подключение.

using (SqlCommand command = new SqlCommand(sql, _sqlConnection))

{

command.CommandType = CommandType.Text;

command.ExecuteNonQuery;

}

CloseConnection;

}

Добавление

логики удаления

Удаление существующей записи не сложнее вставки новой записи. В отличие от метода

InsertAuto
на этот раз вы узнаете о важном блоке
try/catch
, который обрабатывает возможную попытку удалить запись об автомобиле, уже заказанном кем-то из таблицы
Customers
. Стандартные параметры
INSERT
и
UPDATE
для внешних ключей по умолчанию предотвращают удаление зависимых записей в связанных таблицах. Когда предпринимается попытка подобного удаления, генерируется исключение
SqlException
.

В реальной программе была бы предусмотрена логика обработки такой ошибки, но в рассматриваемом примере просто генерируется новое исключение. Добавьте в класс

InventoryDal
следующий метод:

public void DeleteCar(int id)

{

OpenConnection;

// Получить идентификатор автомобиля, подлежащего удалению,

// и удалить запись о нем.

string sql = $"Delete from Inventory where Id = '{id}'";

using (SqlCommand command = new SqlCommand(sql, _sqlConnection))

{

try

{

command.CommandType = CommandType.Text;

command.ExecuteNonQuery;

}

catch (SqlException ex)

{

Exception error = new Exception("Sorry! That car is on order!", ex);

throw error;

}

}

CloseConnection;

}

Добавление логики обновления

Когда речь идет об обновлении существующей записи в таблице

Inventory
, первым делом потребуется решить, какие характеристики будет позволено изменять вызывающему коду: цвет автомобиля, его дружественное имя, модель или все перечисленное? Один из способов предоставления вызывающему коду полной гибкости заключается в определении метода, принимающего параметр типа
string
, который представляет любой оператор SQL, но в лучшем случае это сопряжено с риском.

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

public void UpdateCarPetName(int id, string newPetName)

{

OpenConnection;

// Получить идентификатор автомобиля для модификации дружественного имени.

Поделиться с друзьями: