2013-01-18 49 views
3

我目前在我們的某個項目上使用了dapper,並且始終執行存儲過程。在前面的幾個方法中,當我們執行的存儲過程返回行時,一切正常。執行不返回結果的存儲過程時拋出錯誤

現在我正在面臨一個問題,當我試圖從存儲過程中獲取數據時,它會在找到時返回信息。這是一個非常常見的用例(例如,在應用程序上記錄用戶)。當調用Query方法,以及存儲過程不返回任何行,短小精悍拋出與消息的ArgumentException

「當使用多地圖API確保您設置的splitOn PARAM如果你有比ID參數其他鍵名稱:splitOn」

我正在使用的代碼是:

using (var conn = new SqlConnection(connString)) 
{ 
    conn.Open(); 

    return conn.Query<Customer>(
      sql: "prc_GetCustomer", 
      param: new { Parameter = p }, 
      commandType: CommandType.StoredProcedure).FirstOrDefault(); 
} 

我知道,那裏是在過程預計將不返回任何行,但它應該使用一個Execute方法真的不是我的情況。另外,由於我沒有使用多重映射,所以精巧的異常是誤導性的。

任何想法? 謝謝!

+0

是存儲過程返回數據集的行數爲零還是根本沒有返回數據集? – RBarryYoung

+0

當存儲過程完全沒有返回時,我可以重複這個問題。如果它只返回與對象具有相同結構的空結果集,它就可以正常工作。是否有理由不能返回空數據集而不是什麼? – ElvisLives

+0

現在這個過程沒有任何迴應,我同意這不是一個好的解決方案,但是我們有很多像這樣的遺留存儲過程。我只是想知道,如果短小精悍不能檢查是否沒有字段,只是返回默認(T) – rocco

回答

3

如果查詢沒有返回任何結果網格,則應該使用執行而不是查詢。

+0

我認爲這些存儲過程在返回一個網格(或一個空網格)之前檢查某些內容時使用了錯誤的邏輯。這是一個語義的東西,由一個常規的DbDataReader支持,所以它到了這一點。恕我直言,Dapper應該支持這種情況,但我會接受答案。 – rocco

+0

所以如果我讀了這個權利 PROC-A - >有時會返回0條記錄; 我得到這個錯誤,當它返回0記錄; 因此,爲了解決這個問題,我不得不做一個額外的調用來做一個計數,以確保當它處於不返回記錄的狀態時,我不會調用此proc。 –

+0

@snafu不,無關。從select中返回零行與根本不做select非常不同。如果它不做選擇:執行。 –