C#从存储过程获取返回值无法正常工作

5

我正在尝试运行一个返回单个整数值的存储过程,但我不知道哪里出了问题。 根据我所读的内容,以下代码应该可以工作,但是它并没有运行成功,我看不出错误在哪里。

这是我的存储过程:

    ALTER PROCEDURE [dbo].[getDDNTempID]
    AS
    BEGIN
        declare @tempID int

        select top 1 @tempID = tempID from tblDDNHdr order by tempID asc
        if @tempID is null
            return 0
        else
            return @tempID
    END

这是我尝试获取返回值的代码:

在这里,我尝试获取返回值的代码:

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["test"].ConnectionString))
        {
            SqlCommand cmd = new SqlCommand("getDDNTempID", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection.Open();
            Int32 tempID = (Int32)cmd.ExecuteScalar();
            if (tempID == 0) { tempID = -1; }
            return tempID;
        }

当调用此过程时,我会得到一个NullReferenceException异常,并且给出错误的行是:

            Int32 tempID = (Int32)cmd.ExecuteScalar();

我希望你们能给予任何有关IT技术的指导。

谢谢。


2
这非常类似于这篇帖子:访问 C# 中的 SQL Server 存储过程输出参数 - Steve
2个回答

3

在SQL Server中,返回函数专门用于向调用函数返回完成代码。因此,可用于返回的值是有限的。相反,你需要执行SELECT @tempID并将其视为结果集。


我尝试了你所描述的并修改了我的存储过程,它完美地工作了 - 谢谢。我没有意识到返回函数的限制。 - james33

2
< p > ExecuteScalar 返回结果的第一行第一列的值。您的存储过程没有返回结果集。

SqlCommand.Parameters 集合添加一个参数,并将 Direction 设置为 ReturnValue。它将接收存储过程的返回值。

请注意,返回值仅用于返回状态。您应该使用一个 OUTPUT 参数来返回 @TempId


1
我也尝试了这个解决方案,它也完美地运行了。我猜有很多种方法可以达到同样的效果。 (为什么人们要剥猫皮呢?) - james33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接