2

I have a stored procedure that accepts an input and returns multiple columns. The stored procedure works when I execute it from SSMS and also inside of VS 2013. However when I try and execute it using SqlCommand.ExecuteReader the reader doesn't have any rows in it. If I remove the output parameters from the proc and from the SqlCommand, while still keeping the one input parameter, I am able to return the row that I am looking for.

Here is the stored proc

create Proc sp_ReturnSingleGame
    @GameName varchar(100) output,
    @PlatformName varchar(50) output,
    @ConditionShortDescription varchar(30) output,
    @RetailCost decimal(6,2) output,
    @InStock bit output,
    @GameID int
AS
    select @GameName = GameName, @PlatformName = PlatformName, 
           @ConditionShortDescription = ConditionShortDescription, @RetailCost = RetailCost
         from   Games inner join Condition 
         on     Games.ConditionID = Condition.ConditionID 
                inner join ConsolePlatform
         on Games.PlatformID = ConsolePlatform.PlatformID
         Where Games.GameID = @GameID

    if exists (select GameID 
               From SaleItemized
               Where GameID = @GameID)
        Begin
            set @InStock = 1;
        end
    else
        Begin
            set @InStock = 0;
        end

Here is my C# code

public Game ReturnSingleGame(int gameId)
{
    SqlConnection connection = new SqlConnection(@"server=mylaptop; integrated security=true; database=GameStoreDB;");

    SqlCommand command = this.ReturnCommandForSp_ReturnSingleGame(connection, gameId);

    try
    {
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        if (reader.HasRows == true)
        {
            reader.Read();
            game.GameId = gameId;
            game.GameName = reader["GameName"].ToString();
            game.PlatformName = reader["PlatformName"].ToString();
            game.RetailCost = (decimal) reader["RetailCost"];
        }
        else
        {
            var exception = new ApplicationException("Game was not found");
            throw exception;
        }
    }
    catch (Exception)
    {
        throw;
    }
    finally
    {
        connection.Close();
    }
    return game;
}

private SqlCommand CommandForSp_ReturnSingleGame(SqlConnection connection, int gameId)
{
    string storedProc = @"dbo.sp_ReturnSingleGame";

    SqlCommand command = new SqlCommand(storedProc, connection);
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.Add("@GameName", SqlDbType.VarChar, 100, "GameName");
    command.Parameters["@GameName"].Direction = ParameterDirection.Output;

    command.Parameters.Add("@PlatformName", SqlDbType.VarChar, 50, "PlatformName");
    command.Parameters["@PlatformName"].Direction = ParameterDirection.Output;

    command.Parameters.Add("@ConditionShortDescription", SqlDbType.VarChar, 30, "ConditionShortDescription");
    command.Parameters["@ConditionShortDescription"].Direction = ParameterDirection.Output;

    command.Parameters.Add("@RetailCost", SqlDbType.Decimal);
    command.Parameters["@RetailCost"].SourceColumn = "RetailCost";
    command.Parameters["@RetailCost"].Precision = 6;
    command.Parameters["@RetailCost"].Scale = 2;
    command.Parameters["@RetailCost"].Direction = ParameterDirection.Output;

    command.Parameters.Add("@InStock", SqlDbType.Bit);
    command.Parameters["@InStock"].SourceColumn = "InStock";
    command.Parameters["@InStock"].Direction = ParameterDirection.Output;

    command.Parameters.Add("@GameID", SqlDbType.Int).Value = gameId;
    command.Parameters["@GameID"].SourceColumn = "GameID";
    command.Parameters["@GameID"].Direction = ParameterDirection.Input;

    command.Prepare();

    return command;
}

2 Answers 2

3

Stored procedure provided by you actually doesn't return any rows of data.

All it does - is just set output parameters.

So you don't need any SqlDataReader to retrieve there parameters.

Just call command.ExecuteNonQuery() and then get your parameters values from command.Parameters["@GameName"].Value and so on.

Sign up to request clarification or add additional context in comments.

2 Comments

Did not know that. Obviously a beginner here. I will try that. Thanks
I had some incorrect understanding of my stored proc. In my particular example it will not return a dataset so iterating through a collection or rows doesn't add up and that code should be pitched and it is like you said I should retrieve the values from the parameter. Thanks again
1

Agree with Andy.

For you snippet from one of my project is:`

 DbCommand Cmd = null;
  using (DataClient client = new DataClient())
  {
 SqlParameter[] parameters = new SqlParameter[2];
 parameters[0] = new SqlParameter("@ID", SqlDbType.VarChar);
 parameters[0].Size = 10;
 parameters[0].Direction = ParameterDirection.Output;
 parameters[1] = new SqlParameter("@YourParameterName", SqlDbType.VarChar);
 parameters[1].Value = Class.PropertyName;
 parameters[2] = new SqlParameter("@Year", SqlDbType.Int);
 client.ExecuteNonQuery("ReturnCommandForSp_ReturnSingleGame", CommandType.StoredProcedure, parameters, ref Cmd);

 Then retrieve it like this
 int yourReturnValue= Convert.ToInt32(Cmd.Parameters["@ID"].Value);
 }

Hope it helps.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.