2016-08-17 61 views
2

首先,爲了清楚起見,我認識到ExecuteNonQuery只應用於UPDATE, INSERT, or DELETE語句,對於所有其他類型的語句(如SELECT),返回值爲-1。瞭解ExecuteNonQuery的返回值

我的問題是,爲什麼下面的存儲過程:

CREATE PROCEDURE `ExampleProc`(IN Name varchar(60), OUT ID bigint(20), OUT SP varchar(255)) 
BEGIN 
    SELECT id, sp INTO ID, SP FROM users WHERE username = Name; 
END 

當使用ExecuteNonQuery執行:

using (var conn = new MySqlConnection("Secret")) 
{ 
    conn.Open(); 
    using (var cmd = new MySqlCommand("ExampleProc", conn) { CommandType = CommandType.StoredProcedure }) 
    { 
     cmd.Parameters.AddWithValue("Name", request.Name).MySqlDbType = MySqlDbType.VarChar; 
     cmd.Parameters.Add("ID", MySqlDbType.Int64).Direction = ParameterDirection.Output; 
     cmd.Parameters.Add("SP", MySqlDbType.VarChar).Direction = ParameterDirection.Output; 
     var returnVal = cmd.ExecuteNonQuery(); 
    } 
} 

產生0 in returnVal時名稱行沒有找到,並且1如果找到了?根據我已閱讀的所有文檔,由於存儲過程包含single SELECT statement,因此無論如何我都應該看到-1被返回。相反,它會返回受影響/找到的行數,根據文檔,這是沒有意義的。

最後,我也試過只用"SELECT *" instead of "SELECT id, sp INTO ID, SP"。這似乎總是返回0。仍然不是我期待的-1

+0

檢查鏈接 https://msdn.microsoft.com/en-in/library/ms188774.aspx 對於Select語句嘗試設置'Set RowCount '並測試。另外請注意你提到的行爲是針對Sql Server的,對於不同的數據庫可能表現不同 –

回答

1

讓我們瞭解了ADO.Net的ExecuteNonQuery API的工作,因爲你已經遠離了它應提供影響爲DML查詢和-1爲Select查詢的一部分行數的文件的理解。

但是內部工作是這樣的,在Sql Server情況下,默認設置爲Set NoCount Off有助於以書面形式向TDS protocol,修改的行數,同樣是由Ado.Net的API,從而正確的結果看,這是本地二進制集成ado.netSql Server的結果。更多的細節在下面的鏈接:

Ado.Net TDS Protocol

SET NOCOUNT ON usage

當涉及到其他數據庫一樣MySqlOracle,有沒有相同的行爲的保證,因爲他們的集成不是在同一水平Sql Server。這是發佈在問題中的差異的主要原因,爲了使其在整個數據庫中保持一致,您可能需要依靠Output Parameter自動填充過程中的值,因爲每個數據庫都有機制來計算出數量行更新

+0

謝謝你的回答。看起來奇怪的是會有差異,尤其是因爲在MySQL文檔中正確描述了相同的行爲:https://dev.mysql.com/doc/dev/connector-net/html/M_MySql_Data_MySqlClient_MySqlCommand_ExecuteNonQuery.htm。此外,作爲一個測試,而不是存儲過程,我使用「SELECT * FROM users」設置了MySqlCommand並返回-1,因此看起來存儲過程的工作方式有問題。有小費嗎? – Eaton

+0

@Eaton需要更深入細節,儘管您發佈的鏈接提供了相同的細節,但我確定有一些方面或像'My Sql'這樣的'Sql Server'的'NoCountON'設置,需要探索,以瞭解行爲的偏差 –

+0

我做了一些研究,找不到任何東西。NOCOUNT似乎沒有在MySQL中以任何形式使用。 – Eaton