Как использовать выходной параметр в хранимой процедуре

Я новичок в написании хранимой процедуры. Поэтому я написал один с выходными параметрами и хочу получить доступ к выходному значению, горячий, чтобы сделать это.

Моя Хранимая Процедура:

ALTER PROCEDURE selQuery
    (
        @id int, @code varchar(50) OUTPUT
    )
AS
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id
    RETURN @code

при попытке установить" @code=RecItemCode "получение ошибки как:" оператор SELECT, который присваивает значение переменной, не должен сочетаться с операциями извлечения данных."

и я использую хранимую процедуру как:

con.Open();
cmd.Parameters.AddWithValue("@id", textBox1.Text);
SqlParameter code = new SqlParameter("@code", SqlDbType.Int);
code.Direction = ParameterDirection.Output;
cmd.Parameters.Add(code);
SqlDataReader sdr = cmd.ExecuteReader();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); // getting error
con.Close();

ошибка : "ссылка на объект не указывает на экземпляр объекта." Я хочу получить значение выходного параметра. Как это сделать?

спасибо.

5 ответов


SQL в вашем SP ошибочен. Вы, вероятно, хотите

Select @code = RecItemCode from Receipt where RecTransaction = @id

в вашем заявлении вы не устанавливаете @code, вы пытаетесь использовать его для значения RecItemCode. Это объясняет ваш NullReferenceException при попытке использовать выходной параметр, потому что ему никогда не назначается значение, и вы получаете значение по умолчанию null.

другая проблема заключается в том, что ваш оператор SQL, если переписан как

Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id

он смешивает переменное назначение и данные поиск. Это подчеркивает несколько моментов. Если вам нужны данные, которые управляют @code в дополнение к другим частям данных, забудьте выходной параметр и просто выберите данные.

Select RecItemCode, RecUsername from Receipt where RecTransaction = @id

Если вам просто нужен код, используйте первый оператор SQL, который я вам показал. На случай, если вам действительно нужен выход и данные, используйте два разных оператора

Select @code = RecItemCode from Receipt where RecTransaction = @id
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id

это должно назначить ваше значение выходному параметру, а также вернуть два столбцы данных в строке. Однако это кажется мне ужасно излишним.

если вы пишете свой SP, как я показал в самом верху, просто вызовите cmd.ExecuteNonQuery(); и затем прочитайте значение выходного параметра.


еще одна проблема с вашим SP и кодом. В вашем SP вы объявили @code как varchar. В коде вы указываете тип параметра как Int. Измените свой SP или код, чтобы сделать типы согласованными.


также Примечание: Если все вы возвращаете одно значение, есть другой способ сделать это, который вообще не включает выходные параметры. Вы могли бы написать

 Select RecItemCode from Receipt where RecTransaction = @id

и затем использовать object obj = cmd.ExecuteScalar(); чтобы получить результат, нет необходимости в выходном параметре в SP или в вашем коде.


есть несколько вещей, которые вам нужно решить, чтобы заставить его работать

  1. имя неправильно его не @ouput его @code
  2. вам нужно установить направление параметра для вывода.
  3. не используйте AddWithValue так как его не должно иметь значение только вы Add.
  4. использовать ExecuteNonQuery если вы не возвращаете строки

попробовать

SqlParameter output = new SqlParameter("@code", SqlDbType.Int);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);
cmd.ExecuteNonQuery();
MessageBox.Show(output.Value.ToString());

вам нужно определить выходной параметр как выходной параметр в коде с помощью ParameterDirection.Output перечисление. Существует множество примеров этого, но вот один на MSDN.


SqlCommand yourCommand = new SqlCommand();
yourCommand.Connection = yourSqlConn;
yourCommand.Parameters.Add("@yourParam");
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output;

// execute your query successfully

int yourResult = yourCommand.Parameters["@yourParam"].Value;

перед использованием выходных параметров необходимо закрыть соединение. Что-то вроде этого!--2-->

con.Close();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString());