Proponuję umieścić swoje SqlConnection
i SqlCommand
na używanie bloków, aby zagwarantować ich właściwe usuwanie.
Ponadto, jeśli się nie mylę, parametry wyjściowe są dostępne dopiero po całkowitym przeczytaniu zwracanego zestawu danych wynikowych.
Ponieważ wydaje się, że wcale tego nie potrzebujesz - dlaczego nie użyć po prostu .ExecuteNonQuery()
zamiast? Czy to rozwiązuje problem?
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);
}
Ponadto :ponieważ wydaje się, że naprawdę interesuje Cię tylko liczba wierszy, dlaczego nie uprościć procedury składowanej do czegoś takiego:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
a następnie użyj tego fragmentu kodu w kodzie C#:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();