// Обратите внимание на "заполнители" в запросе 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))
С вызовом хранимых процедур связан один важный аспект: объект команды может представлять оператор SQL (по умолчанию) либо имя хранимой процедуры. Когда объекту команды необходимо сообщить о том, что он будет вызывать хранимую процедуру, потребуется указать имя этой процедуры (в аргументе конструктора или в свойстве
CommandText
) и установить свойство
CommandType
в
CommandType.StoredProcedure
. (В противном случае возникнет исключение времени выполнения, т.к. по умолчанию объект команды ожидает оператор SQL.)
Далее обратите внимание, что свойство
Direction
параметра
@petName
установлено в
ParameterDirection.Output
. Как и ранее, все объекты параметров добавляются в коллекцию параметров объекта команды.
После того, как хранимая процедура, запущенная вызовом метода
ExecuteNonQuery
, завершила работу, можно получить значение выходного параметра, просмотрев коллекцию параметров объекта команды и применив соответствующее приведение: