Метод 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);
Обновление метода InsertAuto()
Добавьте следующую версию метода 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 и достигается лучшая производительность. Параметризированные запросы также чрезвычайно удобны, когда нужно запускать хранимые процедуры.
Выполнение хранимой процедуры
Вспомните, что AutoLot определена единственная хранимая процедура по имени GetPetName.
Рассмотрим следующий (пока что) финальный метод типа InventoryDal, в котором вызывается хранимая процедура GetPetName:
public string LookUpPetName(int carId)
{
OpenConnection();