На заметку! Помещение пользовательского ввода внутрь низкоуровневых операторов SQL, как делалось здесь, обычно считается неудачной практикой. Позже в главе код будет модифицирован для использования параметров.
Вставка
новой записи об автомобиле
Вставка новой записи в таблицу Inventory сводится к построению SQL-оператора
Insert
(на основе пользовательского ввода), открытию подключения, вызову метода
ExecuteNonQuery
с применением объекта команды и закрытию подключения. Увидеть вставку в действии можно, добавив к типу
InventoryDal
открытый метод по имени
InsertAuto
, который принимает три параметра, отображаемые на не связанные с идентичностью столбцы таблицы
Inventory
(
Color
,
Make
и
PetName
). Указанные аргументы используются при форматировании строки для вставки новой записи. И, наконец, для выполнения итогового оператора SQL применяется объект
SqlConnection
.
public void InsertAuto(string color, int makeId, string 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;
// Получить идентификатор автомобиля для модификации дружественного имени.