0

誰かが私の出力パラメータが常に0を返す理由を彼らが見つけられるかどうか見てみてください。

そのプローブは単純なもので、私はそれを見ることができません。

----------------------- SP -------------------------- -

ALTER PROCEDURE [dbo].[test] 
    -- Add the parameters for the stored procedure here
    @SearchPhrase VarChar(100),
    @RecordsFound INT OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT  
          loads of stuff from table

    set @RecordsFound = @@ROWCOUNT;
END

------------------ C#コード-------------------------

using (SqlConnection cn = new SqlConnection(dbConn))
                {
                using (SqlCommand cmd = new SqlCommand(spName, cn))
                    {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@SearchPhrase", SqlDbType.VarChar, 100));
                    cmd.Parameters["@SearchPhrase"].Value = id;
                    cmd.Parameters.Add(new SqlParameter("@RecordsFound", SqlDbType.Int));
                    cmd.Parameters["@RecordsFound"].Direction = ParameterDirection.Output;

                    List<News> Data = new List<News>();
                    try
                        {
                        cn.Open();
                        using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.Default))
                            {
                            if (rdr.HasRows)
                                {
                                while (rdr.Read())
                                    {
                                    Data.Add(new News
                                    {
                                        strNewsTitle            = (string)rdr["NewsTitle"],
                                        strNewsDatePosted       = (string)rdr["NewsDatePosted"],
                                        strNewsDescription      = (string)rdr["NewsDescription"],
                                        strLocationOfImageURL   = (string)rdr["ImageURL"],
                                        recordsReturned = Convert.ToInt32(cmd.Parameters["@RecordsFound"].Value) 
                                    });
                                    int recordsReturned1 = Convert.ToInt32(cmd.Parameters["@RecordsFound"].Value);
                                    }
                                int recordsReturned2 = Convert.ToInt32(cmd.Parameters["@RecordsFound"].Value);
                                }


                            return Data;

ストアドプロシージャをテストすると、@ RecordsFoundが値を返すことがわかるので、コードに問題があると思います。

ありがとう

ジョージ

4

2 に答える 2

3

このページのMSDNで

コマンドに出力パラメーターまたは戻り値が含まれている場合、それらはDataReaderが閉じられるまで使用できません。

using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.Default))
{
    if (rdr.HasRows)
    {
        while (rdr.Read())
        {
            Data.Add(new News
            {
                strNewsTitle = (string)rdr["NewsTitle"],
                strNewsDatePosted = (string)rdr["NewsDatePosted"],
                strNewsDescription = (string)rdr["NewsDescription"],
                strLocationOfImageURL = (string)rdr["ImageURL"],
                recordsReturned = Convert.ToInt32(cmd.Parameters["@RecordsFound"].Value) 
            });
            // NOT AVAILABLE HERE - READER IS OPEN
            // int recordsReturned1 = Convert.ToInt32(cmd.Parameters["@RecordsFound"].Value);
        }
        // STILL OPEN
        //int recordsReturned2 = Convert.ToInt32(cmd.Parameters["@RecordsFound"].Value);
    }
}
// Data reader closed and disposed, get output parameter here or never
int recordsReturned2 = Convert.ToInt32(cmd.Parameters["@RecordsFound"].Value);
于 2013-03-21T23:16:15.253 に答える
2
SET NOCOUNT ON;

行数が有効になっていないため、デフォルトで0になります。

于 2013-03-21T23:09:29.997 に答える