Как использовать выходной параметр в хранимой процедуре
Я новичок в написании хранимой процедуры. Поэтому я написал один с выходными параметрами и хочу получить доступ к выходному значению, горячий, чтобы сделать это.
Моя Хранимая Процедура:
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 или в вашем коде.
есть несколько вещей, которые вам нужно решить, чтобы заставить его работать
- имя неправильно его не
@ouput
его@code
- вам нужно установить направление параметра для вывода.
- не используйте
AddWithValue
так как его не должно иметь значение только выAdd
. - использовать
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());