Предлагам ви да поставите своя SqlConnection
и SqlCommand
в използването на блокове, така че да се гарантира правилното им изхвърляне.
Освен това, ако не греша, изходните параметри са достъпни само след като сте прочели напълно резултантния набор от данни, който се връща.
Тъй като изглежда, че изобщо не се нуждаете от това - защо просто не използвате .ExecuteNonQuery()
вместо? Това решава ли проблема?
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);
}
Също така:тъй като изглежда, че наистина се интересувате само от броя на редовете - защо не опростите съхранената си процедура до нещо подобно:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
и след това използвайте този фрагмент във вашия C# код:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();