Ik raad je aan om je SqlConnection
en SqlCommand
in het gebruik van blokken, zodat de juiste verwijdering ervan gegarandeerd is.
Als ik me niet vergis, zijn de uitvoerparameters ook alleen beschikbaar nadat u de resulterende gegevensset die wordt geretourneerd, volledig hebt gelezen.
Aangezien je dat helemaal niet nodig lijkt te hebben, waarom gebruik je dan niet gewoon .ExecuteNonQuery()
in plaats van? Lost dat het probleem op?
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);
}
Ook:aangezien het lijkt alsof je alleen echt geïnteresseerd bent in het aantal rijen - waarom zou je je opgeslagen procedure niet vereenvoudigen tot zoiets als dit:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
en gebruik vervolgens dit fragment in uw C#-code:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();