如何在存储过程中使用OUTPUT参数

本文关键字:OUTPUT 参数 过程中 存储过程 存储 | 更新日期: 2023-09-27 18:11:29

我是一个编写存储过程的新手。因此,我编写了一个带有输出参数的命令,并希望访问输出值。

My Stored Procedure:

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();

错误:"对象引用未设置为对象的实例。"我想要得到输出参数的值。怎么得到呢?

谢谢。

如何在存储过程中使用OUTPUT参数

要使它工作,您需要解决几个问题

  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());

SP中的SQL是错误的。你可能想要

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或代码中输入输出参数。

需要将输出参数定义为具有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;

在使用输出参数之前需要关闭连接。像这样

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