Иллюстрированный самоучитель по Architecture .NET

Коллекция параметров

Иногда необходимо параметризировать 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 (Набор данных) соответствует параметр.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.