Ti suggerirei di inserire il tuo SqlConnection
e SqlCommand
nell'utilizzare i blocchi in modo da garantirne il corretto smaltimento.
Inoltre, se non sbaglio, i parametri di output sono disponibili solo dopo aver letto completamente il set di dati risultante che viene restituito.
Dal momento che non sembra che tu ne abbia affatto bisogno, perché non usare semplicemente .ExecuteNonQuery()
invece? Questo risolve il problema?
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);
}
Inoltre:poiché sembra che tu sia veramente interessato solo al conteggio delle righe, perché non semplificare la procedura memorizzata in qualcosa del genere:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
e quindi usa questo snippet nel tuo codice C#:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();