Выполнение хранимых процедур с помощью DbCommand
Выполнение хранимых процедур с помощью DbCommand
Хранимой процедурой называется блок программного кода SQL сохраненный в базе данных. Хранимые процедуры могут создаваться для того, чтобы возвращать наборы строк или скалярных типов данных, и могут иметь любое число необязательных параметров. Результатом является рабочая "единица", которая ведет себя подобно типичной функции, с той очевидной разницей, что размещается она в хранилище данных, а не в двоичном рабочем объекте.
Замечание. Хотя обсуждение соответствующей темы в этой главе не предполагается, самая новая версия Microsoft SQL Server (2005) включает в себя CLR-хост! Таким образом, хранимые процедуры (и другие атомарные единицы базы данных) могут создаваться с помощью управляемых языков (например, C#), а не только с помощью традиционного языка SQL. Подробности можно найти на страницах http://www.microsoft.com/sql/2005.
Для иллюстрации соответствующего процесса давайте добавим в программу CarInventoryUpdate новую опцию, которая позволит пользователю выяснить название автомобиля с помощью хранимой процедуры GetPetName. Этот объект базы данных был создан при установке базы данных Cars, и выглядит он так.
CREATE PROCEDURE GetPetName
@carID int,
@petName char(20) output
AS
SELECT @petName = PetName from Inventory where CarID = @carID
Сначала обновите имеющийся в Main() оператор switch, добавив в него обработку нового случая "P" для вызова новой вспомогательной функции с именем LookUpPetName(). которая принимает параметр SqlConnection и возвращает void. Обновите также метод ShowInstructions(), учитывая новый вариант выбора.
Чтобы выполнить хранимую процедуру, следует, как всегда, сначала создать новый объект соединения, сконфигурировать строку соединения и открыть сеанс. Но при создании объекта команды свойству CommandText следует присвоить имя хранимой процедуры (а не SQL-запрос). Также вы обязательно должны установить для свойства CommandType значение CommandType.StoredProcedure (значением по умолчанию является CommandType.Text).
Поскольку наша хранимая процедура имеет один входной и один выходной параметры, нашей целью является построение объекта команды, содержащего два объекта SqlParameter в своей коллекции параметров.
private static void LookUpPetName(SqlConnection cn) {
// Получение номера машины.
Console.Write("Введите номер машины: ");
int carID = int.Parse(Console.ReadLine());
// Установка имени хранимой процедуры.
SqlCommand cmd = new SqlCommand("GetPetName", cn);
cmd.CommandType = CommandType.StoredProcedure;
// Входной параметр.
SqlParameter param = new SqlParameter();
param.ParameterName = "@carID";
param.SqlDbType = SqlDbType.Int;
param.Value = carID;
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param);
// Выходной параметр.
param = new SqlParameter();
param.ParameterName = "@petName";
param.SqlDbType = SqlDbType.Char;
param.Size = 20;
param.Direction = ParameterDirection.Output();
cmd.Parameters.Add(param);
// Выполнение хранимой процедуры.
cmd.ExecuteNonQuery();
// Печать выходного параметра.
Console.WriteLine("Машина {0} называется {1}', carID, cmd.Parameters["@petName"].Value);
}
Обратите внимание на то, что свойство Direction объекта параметра позволяет указать входные и выходные параметры. По завершении вызова хранимой процедуры с помощью ExecuteNonQuery() вы можете получить значение выходного параметра, обратившись к коллекции параметров объекта команды. На рис. 22.9 показан один из возможных вариантов тестового запуска программы.
Рис. 22.9. Вызов хранимой процедуры
Исходный код. Проект СarsInventoryUpdater размещен в подкаталоге, соответствующем главе 22.