Выходные параметры хранимых процедур

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Хранимая процедура может использовать не только входные параметры, через которые передаются значения в процедуру, но и выходные параметры. Выходные параметры по сути представляют результат работы процедуры, те значения, которые она возвращает пользователю.

Опять же возьмем наш базу данных и определим в ней следующую хранимую процедуру:

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, и процедура вернет нам выходные параметры. При этом может возникнуть ситуация, что пользователя с введенным именем не окажется в системе, и тогда параметры будут содержать пустые значения.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850