Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

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 и достигается лучшая производительность. Параметризированные запросы также чрезвычайно удобны, когда нужно запускать хранимые процедуры.

Выполнение хранимой процедуры

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

AutoLot
определена единственная хранимая процедура по имени
GetPetName
.

Рассмотрим следующий (пока что) финальный метод типа

InventoryDal
, в котором вызывается хранимая процедура
GetPetName
:

public string LookUpPetName(int carId)

{

OpenConnection;

string carPetName;

// Установить имя хранимой процедуры.

using (SqlCommand command = new SqlCommand("GetPetName", _sqlConnection))

{

command.CommandType = CommandType.StoredProcedure;

// Входной параметр.

SqlParameter param = new SqlParameter

{

ParameterName = "@carId",

SqlDbType = SqlDbType.Int,

Value = carId,

Direction = ParameterDirection.Input

};

command.Parameters.Add(param);

// Выходной параметр.

param = new SqlParameter

{

ParameterName = "@petName",

SqlDbType = SqlDbType.NVarChar,

Size = 50,

Direction = ParameterDirection.Output

};

command.Parameters.Add(param);

// Выполнить хранимую процедуру.

command.ExecuteNonQuery;

// Возвратить выходной параметр.

carPetName = (string)command.Parameters["@petName"].Value;

CloseConnection;

}

return carPetName;

}

С вызовом хранимых процедур связан один важный аспект: объект команды может представлять оператор SQL (по умолчанию) либо имя хранимой процедуры. Когда объекту команды необходимо сообщить о том, что он будет вызывать хранимую процедуру, потребуется указать имя этой процедуры (в аргументе конструктора или в свойстве

CommandText
) и установить свойство
CommandType
в
CommandType.StoredProcedure
. (В противном случае возникнет исключение времени выполнения, т.к. по умолчанию объект команды ожидает оператор SQL.)

Далее обратите внимание, что свойство

Direction
параметра
@petName
установлено в
ParameterDirection.Output
. Как и ранее, все объекты параметров добавляются в коллекцию параметров объекта команды.

После того, как хранимая процедура, запущенная вызовом метода

ExecuteNonQuery
, завершила работу, можно получить значение выходного параметра, просмотрев коллекцию параметров объекта команды и применив соответствующее приведение:

// Возвратить выходной параметр.

Поделиться с друзьями: