Язык программирования C#9 и платформа .NET5
{inventory.Add(new CarViewModel{Id = (int)dataReader["Id"],Color = (string)dataReader["Color"],Make = (string)dataReader["Make"],PetName = (string)dataReader["PetName"]});}dataReader.Close();return inventory;}Следующий метод выборки получает одиночный объект
на основе значенияCarViewModel:CarIdpublic CarViewModel GetCar(int id){OpenConnection();CarViewModel car = null;// Параметры должны применяться по причинам, связанным с безопасностью.string sql =$@"SELECT i.Id, i.Color, i.PetName,m.Name as MakeFROM Inventory iINNER JOIN Makes m on m.Id = i.MakeIdWHERE i.Id = {id}";using SqlCommand command =new SqlCommand(sql, _sqlConnection){CommandType = CommandType.Text};SqlDataReader dataReader =command.ExecuteReader(CommandBehavior.CloseConnection);while (dataReader.Read()){car = new CarViewModel{Id = (int) dataReader["Id"],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). Указанные аргументы используются при форматировании строки для вставки новой записи. И, наконец, для выполнения итогового оператора SQL применяется объектPetName.SqlConnectionpublic 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():Carpublic 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