Иногда необходимо параметризировать SQL-запрос. Кроме того, бывает желательно связать входные и выходные аргументы хранимой процедуры с переменными программы.
Для того чтобы сделать это, следует определить свойство Parameters (Параметры) класса SqlCommand, которое является коллекцией экземпляров класса SqlParameter. Процедура инсталляции, имеющаяся на Web-узле данной книги, добавляет в базу данных Northwind хранимую процедуру get_customers. To же самое можно выполнить и вручную с помощью Server Explorer в Visual Studio.NET или SQL Query Analyzer (Анализатор запросов SQL). Еще один способ — запустить макрос SQL, поставляемый вместе с примерами к данной книге. Хранимая процедура get_customers иллюстрирует, как можно использовать простую хранимую процедуру, имеющую один аргумент, а именно — название компании, и возвращающую идентификатор (ID) клиента, т.е. указанной компании.
CREATE PROCEDURE get_customers
(dcompanyname nvarchar ( 40), Scustomerid nchar(5) OUTPUT)
AS
select @customerid = CustomerlD from Customers where
CompanyName = @companyname
RETURN
GO
Пример StoredProcedure (Хранимая процедура) демонстрирует, как это можно сделать.
command = // команда
new SqlCommand("get_customers", conn);
command->CommandType = // команда
CommandType::StoredProcedure;
SqlParameter *p = 0; p = new SqlParameter(
"@companyname",
SqlDbType::NVarChar, 40);
p->Direction = ParameterDirection::Input;
// Направление = Ввод p->set_Value(S"Ernst Handel");
// Эрнст Хандель command->Parameters->Add(p);
// команда-> Параметры-> Добавить
p = new SqlParameter(
"@customerid", SqlDbType::NChar, 5);
p->Direction = ParameterDirection::Output;// Направление = Вывод
command->Parameters->Add(p); // команда-> Параметры-> Добавить command->ExecuteNonQuery(); // команда
Console::WriteLine(
"{0} Customerld = {!}",
command->get_Parameters()-> // команда
get_Item("gcompanyname")->Value, // Значение
command->get_Parameters()-> // команда
get_Item("Scustomerid")->Value) ; // Значение
Каждый отдельный член коллекции SqlParameterCollection, являющийся объектом SqlParameter, соответствует одному параметру SQL-запроса или хранимой процедуры. Как показано в примере, параметру не обязательно иметь какую-либо взаимосвязь с определенной таблицей или столбцом базы данных.
Тем минимумом, который необходимо определить в конструкторе или установкой свойств, являются имя и тип параметра. Если параметр имеет непостоянную длину, необходимо также определить его размер.
В приведенном примере к коллекции параметров добавляются два параметра. Первый соответствует аргументу хранимой процедуры. Второй соответствует возвращаемому хранимой процедурой значению.
Имя параметра соответствует имени аргумента хранимой процедуры get_customers. Другие параметры конструктора SqlParameter определяют тип параметра. В первом случае это строка Unicode переменного размера, длиной до 40 символов. Во втором — строка Unicode постоянного размера (5 символов). Обозначение SqlDbType : :NVarChar означает постоянный подлине поток символов Unicode.
Свойство Value (Значение) используется для установки или получения значения параметра. В нашем примере оно используется для инициализации входного параметра @companyname, соответствующего аргументу хранимой процедуры. Оно используется также для получения значения параметра @customerid, соответствующего возвращаемому хранимой процедурой значению.
Выходной параметр должен быть определен как таковой с помощью свойства Direction (Направление). В нашем примере параметр @companyname устанавливается как входной присвоением этому свойству значения ParameterDirection: : Input (Входной параметр). Аналогично, параметр @customerid устанавливается как выходной присвоением этому свойству значения ParameterDirection: :Output (Выходной параметр). Данная операция для выходного параметра должна быть проведена обязательно, так как по умолчанию свойство Direction (Направление) имеет значение, соответствующее входному параметру. Для того чтобы связать параметр с возвращаемым хранимой процедурой значением, используется значение ParameterDirection: :ReturnValue. Для параметров, используемых в обоих направлениях, берется значение ParameterDirection: : InputOutput (Входной и выходной параметр).
Имена параметров можно использовать для доступа к каждому из параметров коллекции параметров SqlCommand. Параметризованные команды могут работать как с классом SqlDataReader, так и с классом DataSet (Набор данных). Позже, при рассмотрении класса DataSet (Набор данных), мы расскажем, как определить свойство параметра Source (Источник), которое указывает, какому именно столбцу объекта DataSet (Набор данных) соответствует параметр.