Jeg vil foreslå, at du sætter din SqlConnection
og SqlCommand
til at bruge blokke, så deres korrekte bortskaffelse er garanteret.
Hvis jeg ikke tager fejl, er outputparametrene kun tilgængelige, når du fuldstændigt har læst det resulterende datasæt, der returneres.
Da du tilsyneladende slet ikke har brug for det - hvorfor ikke bare bruge .ExecuteNonQuery()
i stedet? Løser det problemet?
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);
}
Også:da det ser ud til, at du kun virkelig er interesseret i rækkeantallet - hvorfor ikke forenkle din lagrede procedure til noget som dette:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
og brug derefter denne snippet i din C#-kode:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();