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

时间:2011-10-14 16:52:51

标签: c# sql-server-2008 stored-procedures

我是编写存储过程的新手。所以我用输出参数写了一个并想要访问输出值,热点就可以了。

我的存储过程:

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 个答案:

答案 0 :(得分:24)

要使其正常工作,您需要解决几件事

  1. 名称错误,而不是@ouput @code
  2. 您需要将参数方向设置为输出。
  3. 请勿使用AddWithValue,因为Add不应该使用ExecuteNonQuery
  4. 如果您没有返回行,请使用SqlParameter output = new SqlParameter("@code", SqlDbType.Int); output.Direction = ParameterDirection.Output; cmd.Parameters.Add(output); cmd.ExecuteNonQuery(); MessageBox.Show(output.Value.ToString());
  5. 尝试

    {{1}}

答案 1 :(得分:7)

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

答案 2 :(得分:1)

您需要在具有ParameterDirection.Output枚举的代码中将输出参数定义为输出参数。这里有很多例子,但这里有一个MSDN

答案 3 :(得分:1)

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;

答案 4 :(得分:0)

您需要先关闭连接,然后才能使用输出参数。 像这样的东西

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