簡體   English   中英

使用存儲過程從查詢中獲取結果

[英]Get result from query using stored procedure

我的程序包含一個gridview的行,我想檢查它們是否已經計費。

我通過檢查存儲項目ID的列來做到這一點。

我有以下存儲過程:

ALTER PROCEDURE [dbo].[getBilledItem]
    @itemID int 
AS
BEGIN

    SET NOCOUNT ON;

    SELECT [items].[dbo].[itemLine].itemID
    FROM [items].[dbo].[itemLine]
    WHERE description LIKE '%' + cast(@itemID AS VARCHAR(255)) + '%'

END

我要在程序中執行的操作是在存儲過程返回1 row(s) affected添加itemID,但這行不通。

我的代碼如下:

 using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString))
                using (var command = new SqlCommand("getBilledItem", conn)
                {
                    CommandType = CommandType.StoredProcedure
                })
                {
                    command.Parameters.Add(new SqlParameter("@itemID", SqlDbType.Int)).Value = itemID;
                    conn.Open();

                    int amount = command.ExecuteNonQuery();

                    if (amount > 0)
                    {
                        AlreadyBilledIDs.Add(itemID.ToString());
                    }
                }

即使我的存儲過程確實返回了一行,程序也不會捕獲它。

我在代碼中做錯了什么? 我以為CommandExecuteNonQuery會返回受影響的行數? 為什么這對我來說不起作用?

您需要的是ExecuteScalar方法,當我們只有一行返回一行時使用該方法,或者在這種情況下也有多行的情況下,它將僅選擇第一行的第一列。

所以你可以做:

int amount = Convert.ToInt32(command.ExecuteScalar());

如果需要行數,則可以在存儲過程中使用Count() ,並且c#代碼將保持不變,只需將查詢修改為:

SELECT Count([items].[dbo].[itemLine].itemID)
.............
.............

現在您將擁有查詢返回的總行數:

int count = Convert.ToInt32(command.ExecuteScalar());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM