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

我是编写存储过程的新手。 所以我用输出参数写了一个并且想要访问输出值,hot来做它。

我的存储过程:

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

如果尝试将“@ code = RecItemCode”设置为获取错误:“为变量赋值的SELECT语句不得与Data Retrieval操作结合使用。”

我使用存储过程:

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

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

谢谢。

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

要使其正常工作,您需要解决几个问题

  1. 这个名字是错的,而不是@ouput它的@code
  2. 您需要将参数方向设置为Output。
  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; 

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

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