Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Acessando o parâmetro de saída do procedimento armazenado do SQL Server em C#


Eu sugiro que você coloque seu SqlConnection e SqlCommand em utilizar os blocos para garantir a sua correta destinação.

Além disso, se não me engano, os parâmetros de saída só estão disponíveis depois que você lê completamente o conjunto de dados resultante que está sendo retornado.

Já que você não parece precisar disso - por que não usar .ExecuteNonQuery() em vez de? Isso corrige o problema?
using (SqlConnection con = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=answers;Integrated Security=True"))
using (SqlCommand cmd = new SqlCommand("dbo.GetRowCount", con))
{
    cmd.CommandType = CommandType.StoredProcedure;

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

    con.Open();
    cmd.ExecuteNonQuery();  // *** since you don't need the returned data - just call ExecuteNonQuery
    int ans = (int)cmd.Parameters["@count"].Value;
    con.Close();

    Console.WriteLine(ans);
}

Além disso:como parece que você está realmente interessado na contagem de linhas - por que não simplificar seu procedimento armazenado para algo assim:
ALTER PROCEDURE GetRowCount
AS
   SELECT COUNT(*) FROM Emp WHERE age > 30;

e, em seguida, use este snippet em seu código C#:
    con.Open();

    object result = cmd.ExecuteScalar();

    if(result != null)
    {
        int ans = Convert.ToInt32(result);
    }

    con.Close();