Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Выполнение хранимых процедур с помощью 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.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.248. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз