2009-06-25 10 views
5

Nếu trong thủ tục lưu sẵn, tôi chỉ thực hiện một câu lệnh, select count(*) from sometable, sau đó từ phía máy khách (tôi đang sử dụng C# ADO.Net SqlCommand để gọi thủ tục được lưu trữ), làm thế nào tôi có thể lấy giá trị count(*)? Tôi đang sử dụng SQL Server 2008.Làm thế nào để lấy giá trị vô hướng từ thủ tục lưu sẵn (ADO.NET)

Tôi bị nhầm lẫn vì count(*) không được sử dụng làm thông số giá trị trả về của quy trình được lưu trữ.

cảm ơn trước, George

Trả lời

6

Hoặc bạn sử dụng ExecuteScalar như Andrew gợi ý - hoặc bạn sẽ phải thay đổi mã của bạn một chút:

CREATE PROCEDURE dbo.CountRowsInTable(@RowCount INT OUTPUT) 
AS BEGIN 
    SELECT 
    @RowCount = COUNT(*) 
    FROM 
    SomeTable 
END 

và sau đó sử dụng cuộc gọi ADO.NET này để lấy giá trị:

using(SqlCommand cmdGetCount = new SqlCommand("dbo.CountRowsInTable", sqlConnection)) 
{ 
    cmdGetCount.CommandType = CommandType.StoredProcedure; 

    cmdGetCount.Parameters.Add("@RowCount", SqlDbType.Int).Direction = ParameterDirection.Output; 

    sqlConnection.Open(); 

    cmdGetCount.ExecuteNonQuery(); 

    int rowCount = Convert.ToInt32(cmdGetCount.Parameters["@RowCount"].Value); 

    sqlConnection.Close(); 
} 

Marc

PS: nhưng trong ví dụ cụ thể này, tôi đoán phương án thay thế chỉ thực hiện ExecuteScalar đơn giản và dễ hiểu hơn. Phương pháp này có thể hoạt động OK, nếu bạn cần trả về nhiều hơn một giá trị đơn lẻ (ví dụ: đếm từ một vài bảng hoặc như vậy).

+0

Cảm ơn @Marc, tôi đã thử nghiệm giải pháp của bạn hoạt động! Mát mẻ! – George2

6

Khi bạn thực hiện cuộc gọi truy vấn ExecuteScalar - điều này sẽ trả về kết quả.

Thực hiện truy vấn và trả về cột đầu tiên của hàng đầu tiên trong tập kết quả được trả về bởi truy vấn. Các cột hoặc hàng bổ sung bị bỏ qua.

Vì bạn chỉ trả lại một giá trị, giá trị này sẽ chỉ trả về giá trị từ biểu thức count của bạn. Bạn sẽ cần phải truyền kết quả của phương thức này đến một số int.

+1

Trong trường hợp này, bạn cần làm: SELECT YOURVALUE - và không TRẢ YOURVALUE – Zanoni

+0

"bạn cần làm: SELECT YOURVALUE - và không TRẢ YOURVALUE" - bối rối, anh có ý gì? Bạn có thể giải thích thêm được không? – George2

+0

@Andrew, tôi thích câu trả lời của bạn, nhưng sau khi đọc từ trả lời của Marc, tôi nghĩ cách thanh lịch hơn nên sử dụng giá trị trả về của thủ tục lưu trữ, mọi nhận xét? – George2

1

câu trả lời marc_s hoạt động tốt cho số nguyên. nhưng đối với varchar chiều dài phải được xác định.

cmdGetCount.Parameters.Add("@RowCount", SqlDbType.varchar,30).Direction = ParameterDirection.Output;