2016-11-13 77 views
1

我創建了一個用於刪除記錄的存儲過程。在這個存儲過程中,我首先檢查我將要刪除的數據的用法。如果正在使用它,那麼存儲過程將返回-2,否則它會刪除記錄。ExecuteNonQuery總是返回-1

但問題是,即使記錄存在其返回-1,而不是-2。我也設置了NOCOUNT OFF,但不知道問題出在哪裏。

我知道這個問題已經被設置NOCOUNT OFF但回答它不是爲我工作

ALTER PROCEDURE [dbo].[spDeletePIDNumber] 
    @Id int 
AS 
BEGIN 
    SET NOCOUNT OFF; 

    -- Insert statements for procedure here 
    if(exists(select * from tblBills where PID = @Id)) 
    begin 
     return -2 
    end 
    else 
    begin 
     Delete from HelperPIDNumber 
     where Id = @Id 
    end 
END 

public int DeletePIDNumber(int Id) 
{ 
     try 
     { 
      int result = 0; 

      using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.connection)) 
      { 
       var cmd = new SqlCommand("spDeletePIDNumber", conn); 
       cmd.CommandType = System.Data.CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@Id", Id); 

       conn.Open(); 
       result = cmd.ExecuteNonQuery(); 
      } 

      return result; 
     } 
     catch 
     { 
      throw; 
     } 
    } 
+0

您可以發佈您正在嘗試的代碼嗎? – Geethanga

+0

後使用了'.ExecuteNonQuery()' – McNets

+0

其中的代碼,並添加下面的'刪除,,,,'聲明瞭一些返回值。 – McNets

回答

3

ExecuteNonQuery文檔:

執行對連接並返回一個Transact-SQL語句受影響的行數

SET NOCOUNT ON;在你的程序中明確地告訴給SQL Server 返回行數。在這種情況下,ExecuteNonQuery函數的返回值爲-1。

此外,如果該過程不影響任何行,即使NOCOUNTOFF,也不會返回行計數。在這種情況下,回報也是-1。


你似乎想要做的是獲取存儲過程的return value。你不會從ExecuteNonQuery的結果中得到這個結果。請參考這個問題在計算器上:Getting return value from stored procedure in ADO.NET

2

一般ExecuteNonQuery將返回受影響的記錄數。它會在兩種情況下返回-1

  1. SET NOCOUNT ON已設置。從你的代碼來看,它很清晰,你有SET NOCOUNT OFF,所以這對你的情況不是問題。

  2. 如果受影響的行數是什麼,它會返回-1。在你的情況,看起來你正在檢查數據存在從一個表tblBills和刪除從另一個表HelperPIDNumber。所以有更多的機會會有沒有匹配的記錄,並沒有刪除。

請檢查點#2上面。

if(exists(select * from tblBills where PID = @Id)) 
begin 
    return -2 
end 
else 
begin 
    Delete from HelperPIDNumber where Id = @Id 
end 
+0

簡而言之,ExecuteNonQuery的返回值是一個系統保留值,您不應該試圖干涉這一點。如果您想要將自定義值發送回SP的C#代碼,請使用輸出參數並提取該值。 – Geethanga

+0

@Geethanga這不是我的代碼:-)我已經複製了用戶的代碼,並突出顯示了代碼 – Aruna

0

使用cmd.ExecuteScalar(),而不是作爲cmd.ExecuteNonQuery()回報cmd.ExecuteNonQuery()唯一受影響的行數,而不是您選擇的值。

+0

Nope的可能問題。從文檔中:'執行查詢,然後**返回查詢**返回的結果集中第一行的第一列。其他列或行將被忽略。這與return **值**不一樣。 –

+0

'return -2'可以改爲'SELECT -1' –

+0

OP可以做到這一點,但這通常是一個壞主意。對於存儲過程,返回結果集的格式相同(即相同順序的相同列)通常是一個好主意。 –