Хранимая процедура может использовать не только входные параметры, через которые передаются значения в процедуру, но и выходные параметры. Выходные параметры по сути представляют результат работы процедуры, те значения, которые она возвращает пользователю.
Опять же возьмем наш базу данных и определим в ней следующую хранимую процедуру:
1 2 3 4 5 6 7 |
CREATE PROCEDURE [dbo].[sp_GetAgeRange] @name nvarchar(50), @minAge int out, @maxAge int out AS SELECT @minAge = MIN(Age), @maxAge = MAX(Age) FROM Users WHERE Name LIKE '%' + @name + '%' GO |
В этой процедуре определено три параметра, с помощью которых мы будем получать минимальный и максимальный возраст в базе данных. Через параметр @name мы будем получать имя пользователя, для которого осуществляется поиск минимального и максимального возраста. Причем в данном случае параметр по умолчанию имеет значение ‘%’. Данное значение указывает на произвольную строку. То есть если значение для этого параметра передано, то процедура будет находить возраст только для пользователей с этим именем. Если же значение для параметра не передано, то процедура будет находить минимальный и максимальный возраст всех пользователей вне зависимости от имени.
Параметры @minAge и @maxAge являются выходными благодаря указанию ключевого слова out
в их определении. Через них мы собственно и будем получать минимальный и максимальный возраст.
Теперь перейдем к программе на C# и определим в ней следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
using System; using System.Data.SqlClient; using System.Data; namespace AdoNetConsoleApp { class Program { static string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; static void Main(string[] args) { Console.Write("Введите имя пользователя:"); string name = Console.ReadLine(); GetAgeRange(name); Console.Read(); } private static void GetAgeRange(string name) { string sqlExpression = "sp_GetAgeRange"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = new SqlCommand(sqlExpression, connection); command.CommandType = CommandType.StoredProcedure; SqlParameter nameParam = new SqlParameter { ParameterName = "@name", Value = name }; command.Parameters.Add(nameParam); // опеределяем первый выходной параметр SqlParameter minAgeParam = new SqlParameter { ParameterName = "@minAge", SqlDbType = SqlDbType.Int // тип параметра }; // указываем, что параметр будет выходным minAgeParam.Direction = ParameterDirection.Output; command.Parameters.Add(minAgeParam); // опеределяем второй выходной параметр SqlParameter maxAgeParam = new SqlParameter { ParameterName = "@maxAge", SqlDbType = SqlDbType.Int }; maxAgeParam.Direction = ParameterDirection.Output; command.Parameters.Add(maxAgeParam); command.ExecuteNonQuery(); Console.WriteLine("Минимальный возраст: {0}", command.Parameters["@minAge"].Value); Console.WriteLine("Максимальный возраст: {0}", command.Parameters["@maxAge"].Value); } } } } |
Выходные параметры команды определяются также, как и входные за тем исключением, что для свойства Direction
нам надо установить значение ParameterDirection.Output. По умолчанию все параметры имеют значение ParameterDirection.Input
, которое указывает, что они являются входными.
После выполнения команды с помощью метода ExecuteNonOuery()
мы можем получить параметры по названию или по их индексу в коллекции параметров: command.Parameters["название параметра"]
. И чтобы получить само значение параметра, надо использовать его свойство Value
.
Теперь мы можем ввести имя пользователя, либо просто нажать на Enter, и процедура вернет нам выходные параметры. При этом может возникнуть ситуация, что пользователя с введенным именем не окажется в системе, и тогда параметры будут содержать пустые значения.