Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy cập tham số đầu ra thủ tục được lưu trữ của SQL Server trong C #

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();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Change Recovery Model

  2. Giao dịch Khung thực thể đang hoạt động lâu dài

  3. Tinh chỉnh chỉ mục không gian địa lý

  4. tính toán xếp hạng trung bình trong máy chủ sql

  5. Trả lại đặc quyền bảng từ một máy chủ được liên kết trong SQL Server (Ví dụ T-SQL)