Je vous suggère de mettre votre SqlConnection
et SqlCommand
à utiliser des blocs afin de garantir leur élimination appropriée.
De plus, si je ne me trompe pas, les paramètres de sortie ne sont disponibles qu'après avoir lu complètement l'ensemble de données résultant renvoyé.
Puisque vous ne semblez pas du tout en avoir besoin, pourquoi ne pas simplement utiliser .ExecuteNonQuery()
Au lieu? Cela résout-il le problème ?
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);
}
Aussi :puisqu'il semble que seul le nombre de lignes vous intéresse vraiment, pourquoi ne pas simplifier votre procédure stockée en quelque chose comme ceci :
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
puis utilisez cet extrait dans votre code C# :
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();