0

選択したストアドプロシージャからの戻り値、つまり返されたレコードの数をどのように取得しますか。

私が求めている値はRETURN(SELECT COUNT(*)FROM #Eligible_Ids);です。

私がそうすることができた唯一の方法は次のとおりです:

DECLARE @NumberOfResults INT

SET @NumberOfResults =(SELECT COUNT(*)FROM #Eligible_Ids)

次に、selectステートメントでNumberResults = @NumberOfResultsがありますが、これにより、再調整されたデータに余分な行が追加されます。

クラスの私のコードは

 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;

これを正しい方法で行うための助けをいただければ幸いです

ジョージ

4

3 に答える 3

2

戻り値を取得するには、ReturnValue方向のパラメーターを追加します。あなたはすでにこれを行っているので、それはただです:

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

重要:これは、リーダーからすべての結果行を読み取ったでのみ読み取ることができます。パラメーター値と戻り値は、TDSストリームの最後にあります。

于 2013-02-26T19:11:50.127 に答える
2

これを見る

そしてあなたの特定のケースでは、c#コーディングでこれを変更してください

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

これに

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

宣言する代わりにSotoredProcedureで

DECLARE @NumberOfResults INT

出力パラメータを追加します

@NumberOfResults INT output

次に、このように@NumberofResultsパラメーターの値を読み取ることができます

TextBox1.Text = cmd.Parameters["@NumberOfResults"].Value.ToString();
于 2013-02-26T20:58:52.190 に答える
0

@@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);
        }
    }
}
于 2013-02-26T19:09:10.627 に答える