Ich würde vorschlagen, dass Sie Ihre SqlConnection
setzen und SqlCommand
Blöcke zu verwenden, damit deren ordnungsgemäße Entsorgung gewährleistet ist.
Wenn ich mich nicht irre, sind die Ausgabeparameter auch erst verfügbar, nachdem Sie den resultierenden Datensatz, der zurückgegeben wird, vollständig gelesen haben.
Da Sie das anscheinend überhaupt nicht brauchen - warum nicht einfach .ExecuteNonQuery()
verwenden stattdessen? Behebt das das 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);
}
Außerdem:Da es scheint, dass Sie nur wirklich an der Zeilenanzahl interessiert sind - warum vereinfachen Sie Ihre gespeicherte Prozedur nicht so:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
und verwenden Sie dann dieses Snippet in Ihrem C#-Code:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();