再論c#獲取儲存過程返回值(包括SqlSugar)
其實這個問題好多年以前研究過:
https://blog.csdn.net/xpnew/article/details/6909902
最近因為需要統計日結月結,給同事寫了一套呼叫儲存過程的程式碼。同時因為專案ORM層是通過SqlSugar實現的,就又研究了一下SqlSugar呼叫儲存過程的內容。
折騰了一番之後,對於【c#獲取儲存過程返回值】這個技術點,又有了新一層認識。下面寫一下要點總結:
一、核心內容是指定Command引數的Direction
MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
這個和以前的的看法是一樣的。只是這次經歷的研究,發現有很多細節在裡面,在後面逐一列出
二、呼叫儲存過程的方法:GetScalar和ExecuteCommand
在SqlSugar當中,使用Direction 的辦法,這兩種呼叫方法都能正確地返回值。
但是這兩個方法,實際上是不一樣的:
GetScalar返回的是結果集(表格)的第一行、第一列。
ExecuteCommand是執行了儲存過程,成功更新/新增多少條。
具體來說:
■完全沒有執行任何更新、插入,返回-1
■只有UPDATE DELET INSERT 執行的結果會算在內,上圖的2/3/3分別是隨便添加了一個update更新了2行,刪除了原來的統計結果3條,重新計算了統計結果再插入也是3條。
■包含多個UPDATE DELET INSERT操作的時候,返回的結果是全部操作行數之和。
三、儲存過程裡面的Select/Update和Return
在不太嚴謹的使用當中,可以用Select代替Return Value(前提是通過GetScalar 呼叫 )
儲存過程當中 這樣寫:
執行結果:
c#程式碼除錯:
不過當我做了一個簡單的干擾就不行了。
比如說我在最終返回之前添加了一個select
在SQL Server管理器裡面:
C#程式碼除錯:
也就是說,使用Select返回結果是有侷限的,不能在最終返回之前有任何其它的SELECT.
當然,UPDATE就更不行了。參見上一節。
總之,假如想把儲存過程當作一個有返回程式碼的“函式”、“方法”看待的話,還是要用 OUTPUT或者ReturnValue
四、ReturnValue的其它細節
1、需要在執行之前新增到Command引數裡。
以前在c#通過 ADO.net連線資料庫的時候,我好像驗證過,執行之前指定了返回引數才有這個處理,ADO.net不會自動處理。
SqlSugar裡面這次驗證過了,不新增是不會自動生成這個引數的,看了原始碼也是這樣。
2、ReturnValue是“額外的”引數數量,如果出現了“使用了過多的引數數量”一類的異常,請檢查其它引數,從其它的引數上尋找問題。
3、引數的名稱無關緊要,只要不會干擾到其它傳入、傳出引數就行。
&n