SqlConnection
を配置することをお勧めします およびSqlCommand
ブロックを使用して、適切な廃棄が保証されるようにします。
また、私が間違っていない場合、出力パラメータは、返される結果のデータセットを完全に読み取った後でのみ使用できます。
それはまったく必要ないようですので、.ExecuteNonQuery()
を使用してみませんか。 代わりは?問題は解決しましたか?
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);
}
また、行数にのみ関心があるように思われるので、ストアドプロシージャを次のように単純化してみませんか。
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
次に、C#コードでこのスニペットを使用します:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();