1. 程式人生 > >再論c#獲取儲存過程返回值(包括SqlSugar)

再論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