Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6
Хранимая процедура может использовать не только входные параметры, через которые передаются значения в процедуру, но и выходные параметры. Выходные параметры по сути представляют результат работы процедуры, те значения, которые она возвращает пользователю.
Опять же возьмем наш базу данных и определим в ней следующую хранимую процедуру:
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# и определим в ней следующий код:
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, и процедура вернет нам выходные параметры. При этом может возникнуть ситуация, что пользователя с введенным именем не окажется в системе, и тогда параметры будут содержать пустые значения.