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

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

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

  {

    command.CommandType = CommandType.Text;

    command.ExecuteNonQuery();

  }

  CloseConnection();

}

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

<p id="AutBody_Root854"><strong>Создание строго типизированного метода InsertCar()</strong></p>

Добавьте в класс 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();

}

<p id="AutBody_Root855"><strong>Добавление логики удаления</strong></p>

Удаление существующей записи не сложнее вставки новой записи. В отличие от метода 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();

}

<p id="AutBody_Root856"><strong>Добавление логики обновления</strong></p>

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

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

public void UpdateCarPetName(int id, string newPetName)

{

  OpenConnection();

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

  string sql = $"Update Inventory Set PetName = '{newPetName}'

                 Where Id = '{id}'";

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

  {

    command.ExecuteNonQuery();

  }

  CloseConnection();

}

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

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