C# 如何在存储过程中使用输出参数

C# 如何在存储过程中使用输出参数,c#,sql-server-2008,stored-procedures,C#,Sql Server 2008,Stored Procedures,我不熟悉编写存储过程。所以我写了一个带有输出参数的,想要访问输出值的,hot来做 我的存储过程: ALTER PROCEDURE selQuery ( @id int, @code varchar(50) OUTPUT ) AS SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id RETURN @code 如果试图将“@code=REDUC

我不熟悉编写存储过程。所以我写了一个带有输出参数的,想要访问输出值的,hot来做

我的存储过程:

ALTER PROCEDURE selQuery
    (
        @id int, @code varchar(50) OUTPUT
    )
AS
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id
    RETURN @code
如果试图将“@code=REDUCTEMCODE”获取错误设置为:“为变量赋值的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
    它的
    @code
  • 您需要将参数方向设置为输出
  • 不要使用
    AddWithValue
    ,因为它不应该只有您添加的值
  • 如果不返回行,请使用
    ExecuteNonQuery
  • 试一试


    您需要使用
    ParameterDirection.output
    枚举将输出参数定义为代码中的输出参数。有很多这样的例子,但这里有一个。

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

    Select @code = RecItemCode from Receipt where RecTransaction = @id
    
    在您的语句中,您并没有设置@code,而是试图将其用于REDUCTEMCODE的值。这可以解释当您尝试使用输出参数时出现的
    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
    

    然后使用
    objectobj=cmd.ExecuteScalar()
    要获得结果,SP或代码中不需要输出参数。

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

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

    很好,但是如何获得输出参数的值??output.Value.ToString()将错误设置为“对象引用未设置为对象的实例”。不要说“您忘记了”,因为我没有忘记,实际上我不知道:-(@rapsalands,执行查询后,从参数中检索值。
    cmd.ExecuteNonQuery();int Value=(int)output.Value;
    不知道为什么会得到一个空引用。也许你应该更新你的问题。@Rapsaland,你的SP看起来完全错了,暂时不要删除你的代码。首先,我不认为你的意思是
    背诵emcode=@code
    ,它试图将@code分配给背诵emcode。你从来没有设置@code。@Rapsaland你不能ust执行代码。它不是一个独立的代码块。该错误表示您尚未实例化对象(即创建它的新实例)。这只是为了让您大致了解如何从存储过程的输出参数中获取值。事实上,我正在尝试学习SP,以前从未学习过。如果您能知道我的代码有什么问题,那就太好了。我的意思是我必须在何处创建实例??谢谢您和+1。'object obj=cmd.ExecuteScalar()工作得很好。我能够用两行c代码完成我所需要的,第二行是“myString=obj.ToString();”。
     Select RecItemCode from Receipt where RecTransaction = @id
    
    con.Close();
    MessageBox.Show(cmd.Parameters["@code"].Value.ToString());