Метод UpdateCarPetName() требует предоставления двух параметров: одного для Id автомобиля и еще одного для нового значения PetName. Первый параметр создается в точности как в предыдущих двух примерах (за исключением отличающегося имени переменной), а второй параметр обеспечивает отображение на тип NVarChar базы данных (тип поля PetName из таблицы Inventory). Обратите внимание на установку значения Size. Важно, чтобы этот размер совпадал с размером поля базы данных, что обеспечит отсутствие проблем при выполнении команды:

SqlParameter paramId = new SqlParameter

{

  ParameterName = "@carId",

  Value = id,

  SqlDbType = SqlDbType.Int,

  Direction = ParameterDirection.Input

};

SqlParameter paramName = new SqlParameter

{

  ParameterName = "@petName",

  Value = newPetName,

  SqlDbType = SqlDbType.NVarChar,

  Size = 50,

  Direction = ParameterDirection.Input

};

Модифицируйте строку SQL для применения параметров:

string sql = $"Update Inventory Set PetName = @petName Where Id = @carId";

Последнее обновление касается добавления новых параметров в коллекцию Parameters объекта команды:

command.Parameters.Add(paramId);

command.Parameters.Add(paramName);

<p id="AutBody_Root862"><strong>Обновление метода InsertAuto()</strong></p>

Добавьте следующую версию метода InsertAuto(), чтобы задействовать объекты параметров:

public void InsertAuto(Car car)

{

  OpenConnection();

  // Обратите внимание на "заполнители" в запросе SQL.

  string sql = "Insert Into Inventory" +

    "(MakeId, Color, PetName) Values" +

    "(@MakeId, @Color, @PetName)";

  // Эта команда будет иметь внутренние параметры.

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

  {

    // Заполнить коллекцию параметров.

    SqlParameter parameter = new SqlParameter

    {

      ParameterName = "@MakeId",

      Value = car.MakeId,

      SqlDbType = SqlDbType.Int,

      Direction = ParameterDirection.Input

    };

    command.Parameters.Add(parameter);

    parameter = new SqlParameter

    {

      ParameterName = "@Color",

      Value = car.Color,

      SqlDbType = SqlDbType. NVarChar,

      Size = 50,

      Direction = ParameterDirection.Input

    };

    command.Parameters.Add(parameter);

    parameter = new SqlParameter

    {

      ParameterName = "@PetName",

      Value = car.PetName,

      SqlDbType = SqlDbType. NVarChar,

      Size = 50,

      Direction = ParameterDirection.Input

    };

    command.Parameters.Add(parameter);

    command.ExecuteNonQuery();

    CloseConnection();

  }

}

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

<p id="AutBody_Root863"><strong>Выполнение хранимой процедуры</strong></p>

Вспомните, что хранимая процедура представляет собой именованный блок кода SQL, сохраненный в базе данных. Хранимые процедуры можно конструировать так, чтобы они возвращали набор строк либо скалярных типов данных или выполняли еще какие-то осмысленные действия (например, вставку, обновление или удаление записей); в них также можно предусмотреть любое количество необязательных параметров. Конечным результатом будет единица работы, которая ведет себя подобно типичной функции, но только находится в хранилище данных, а не в двоичном бизнес-объекте. В текущий момент в базе данных AutoLot определена единственная хранимая процедура по имени GetPetName.

Рассмотрим следующий (пока что) финальный метод типа InventoryDal, в котором вызывается хранимая процедура GetPetName:

public string LookUpPetName(int carId)

{

  OpenConnection();

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

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