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();