Tôi khuyên bạn nên đặt SqlConnection
của bạn và SqlCommand
vào việc sử dụng các khối để đảm bảo việc xử lý đúng cách của chúng.
Ngoài ra, nếu tôi không nhầm, các tham số đầu ra chỉ có sẵn sau khi bạn đã đọc hoàn toàn tập dữ liệu kết quả đang được trả về.
Vì bạn dường như không cần điều đó - tại sao không chỉ sử dụng .ExecuteNonQuery()
thay vì? Điều đó có khắc phục được sự cố không?
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);
}
Ngoài ra:vì có vẻ như bạn chỉ thực sự quan tâm đến số lượng hàng - tại sao không đơn giản hóa thủ tục được lưu trữ của bạn thành một cái gì đó như thế này:
ALTER PROCEDURE GetRowCount
AS
SELECT COUNT(*) FROM Emp WHERE age > 30;
và sau đó sử dụng đoạn mã này trong mã C # của bạn:
con.Open();
object result = cmd.ExecuteScalar();
if(result != null)
{
int ans = Convert.ToInt32(result);
}
con.Close();