简体   繁体   English

从选择存储过程中获取返回值

[英]Get return value from select stored procedure

How do you get the return value from a select stored procedure, ie number of records returned. 如何从选择的存储过程中获取返回值,即返回的记录数。

The value I'm after is RETURN ( SELECT COUNT( * ) FROM #Eligible_Ids ); 我需要的值是RETURN(SELECT COUNT(*)FROM #Eligible_Ids);

The only way I have been able to do it so for is as follows: 我能够这样做的唯一方法如下:

DECLARE @NumberOfResults INT

SET @NumberOfResults = (SELECT COUNT( * ) FROM #Eligible_Ids) SET @NumberOfResults =(从#Eligible_Ids中选择COUNT(*)条)

Then in select statement i have NumberResults = @NumberOfResults but this adds an extra row to the data retuned. 然后在选择语句中,我有NumberResults = @NumberOfResults,但这为重新调整的数据添加了额外的一行。

My code in class is 我在课堂上的代码是

 using (SqlCommand cmd = new SqlCommand(spName, cn))
                {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@strSearchPhrase", SqlDbType.VarChar, 100));
                cmd.Parameters.Add(new SqlParameter("@SearchMode", SqlDbType.Int, 4));
                cmd.Parameters.Add(new SqlParameter("@intPageNumber", SqlDbType.Int));
                cmd.Parameters.Add(new SqlParameter("@intRecordsPerPage", SqlDbType.Int));
                cmd.Parameters.Add(new SqlParameter("@intTotalRecordsReturned", SqlDbType.Int));
                cmd.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int));
                cmd.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;
                cmd.Parameters["@strSearchPhrase"].Value = q;
                cmd.Parameters["@SearchMode"].Value = 1;
                cmd.Parameters["@intPageNumber"].Value = pagenumber;
                cmd.Parameters["@intRecordsPerPage"].Value = 10;
                cmd.Parameters["@intTotalRecordsReturned"].Value = 10;

                cn.Open();
                using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.Default))
                    {
                    if (rdr.HasRows)
                        {
                        while (rdr.Read())
                            {
                            Data.Add(new DisplaySearchResults
                            {
                                Title           = (string)rdr["PageTitle"],
                                Description     = (string)rdr["PageParagraph"],
                                URL             = (string)rdr["PageURL"],
                                returnvalue     = (int)rdr["NumberResults"]
                            });
                            }
                        }


                    return Data;

Any help on doing this the correct way would be appreciated 任何以正确方式执行此操作的帮助将不胜感激

George 乔治

To get the return value, you add a parameter with direction ReturnValue. 要获取返回值,请添加一个方向为ReturnValue的参数。 Since you have already done this, it is just: 既然您已经做到了,那就只是:

var val = cmd.Parameters["@RETURN_VALUE"].Value;

Important: you can only read this after you have read all the result rows from the reader: parameter values and return values are at the end of the TDS stream. 重要提示:只有从阅读器中读取了所有结果行后,才能阅读此内容:参数值和返回值位于TDS流的末尾。

See this 看到这个

And in your specific case alter this in c# Coding 并在您的特定情况下,在c#编码中对此进行更改

cmd.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int));
cmd.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;

to this 对此

cmd.Parameters.Add(new SqlParameter("@NumberOfResults", SqlDbType.Int));
cmd.Parameters["@NumberOfResults"].Direction = ParameterDirection.Output;

and in SotoredProcedure instead of declaring 并在SotoredProcedure中而不是声明

DECLARE @NumberOfResults INT

add an output parameter 添加输出参数

@NumberOfResults INT output

and then you can read the value in @NumberofResults parameter like this 然后您可以像这样读取@NumberofResults参数中的值

TextBox1.Text = cmd.Parameters["@NumberOfResults"].Value.ToString();

Try @@ROWCOUNT 尝试@@ ROWCOUNT

--Simple T-Sql Proc

CREATE PROCEDURE usp_OutputRowExample
    @Count INT OUTPUT
AS
BEGIN
    SELECT * FROM <table>; --Get your entities

    SELECT @Count = @@ROWCOUNT; --@@ROWCOUNT returns the amount of
                                --affected rows from the last query
END

//From C#

public Tuple<IEnumerable<object>, int>> GetObjects()
{
    using(var connection = new SqlConnection(_connectionString))
    {
        connection.Open();

        using(var command = sqlConnection.CreateCommand())
        {
            command.CommandText = "usp_OutputRowExample";
            command.CommandType = CommandType.StoredProcedure;

            var outputParameter = new SqlParameter("@Output", SqlDbType.Int)
                { Direction = ParameterDirection.Output };

            command.Parameters.Add(outputParameter);

            using(var reader = command.ExecuteReader())
            {
                var entities = new List<entities>();
                while(reader.Read())
                {
                    //Fill entities
                }
            }

            var outputCount = outputParameter.Value as int? ?? default(int);

            return new Tuple<IEnumerable<object>, int>(entities, outputCount);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM