2011-11-14 90 views
8

我以前使用此方法返回更改的行數。我是運行插入方法,插入在存儲過程中運行良好,但ExecuteNonQuery的返回值始終返回-1。c#:ExecuteNonQuery()返回-1

這裏是我的C#代碼:

int ret = 0; 

using (SqlConnection conn = new SqlConnection(this.ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand(QueryName, conn)) 
    { 
     conn.Open(); 

     if (Params != null) 
      cmd.Parameters.AddRange(Params); 

     cmd.CommandType = CommandType.StoredProcedure; 

     ret = cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 
} 

return ret; 

爲什麼我得到-1,而不是實際的行數變化嗎?

+0

因此,表中的修改實際發生,但你得到-1? – Tudor

+0

它可能會返回任何您的sproc返回,如果沒有其他指定,可能是-1。 –

+0

您是否真的使用事件探查器捕獲了SQL調用並手動執行以查看實際更改的行號? –

回答

21

如果您使用此方法來調用一個表中執行 UPDATE/INSERT方法返回一個存儲過程-1,如果存儲procudere 具有在ON值的SET NOCOUNT。

- source

5

從微軟:

對於UPDATE,INSERT和DELETE語句,返回值是受該命令影響的行數。當插入或更新的表上存在觸發器時,返回值包括受插入或更新操作以及觸發器或觸發器影響的行數影響的行數。對於所有其他類型的語句,返回值爲-1。如果發生回滾,返回值也是-1。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

你可能會得到-1,因爲你使用存儲過程,而不是直接表變化

0

,您在您的存儲過程返回什麼樣的價值?你可以顯示你的存儲過程的代碼。您可能需要編輯存儲過程以返回所需的值,或者,您的存儲過程特別返回-1,或者存儲過程返回的變量的值爲-1。

0

獲取存儲過程的行計數輸出,例如使用@[email protected]@Rowcount。在DAL中,使用dbManager.AddOutParameter("RowCount", DbType.Int32, rowCount);然後在最後一行中,您將獲得(int)dbManager.GetParameterValue("RowCount")