Jag skulle föreslå att du lägger din SqlConnection
och SqlCommand
att använda block så att deras korrekt bortskaffande garanteras.
Dessutom, om jag inte har fel, är utdataparametrarna endast tillgängliga efter att du helt har läst den resulterande datamängden som returneras.
Eftersom du inte verkar behöva det alls - varför inte bara använda .ExecuteNonQuery()
istället? 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);
}
Dessutom:eftersom det verkar som att du bara verkligen är intresserad av radantalet - varför inte förenkla din lagrade procedur till något i stil med detta:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
och använd sedan detta utdrag i din C#-kod:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();