簡體   English   中英

ASP.NET Core 3.0 實體框架中的存儲過程

[英]Stored Procs in ASP.NET Core 3.0 Entity Framework

我在 ASP.NET Core 3.0 中調用存儲過程時遇到問題。 我調用的一些方法已經起作用,但我發現一個不起作用,而且我還沒有看到很多解決這個問題的在線文檔(在 3.0 中,使用 ExecuteSqlInterpolatedAsync 和 ExecuteSqlRaw 代替 FromSql 等方法) .

存儲過程很簡單(它只是調用另一個存儲過程並返回 int):

ALTER PROCEDURE [dbo].[getsystemnumber](@p_controlid varchar(8),
                 @p_alternateid varchar(8))

AS
DECLARE @return_number  int

-- Requests a block of 1 number
EXECUTE @return_number = dbo.getsystemnumber_gateway @p_controlid, @p_alternateid, 1

RETURN @return_number 

這是一個長期存在的存儲過程,每天都被舊應用程序使用並且工作正常,如果我手動運行它,它工作正常。

我正在嘗試創建一個簡單的方法,可以在應用程序需要新 Id 時調用該方法

        public async Task<int> getNewId()
        {
            using (TMW_LiveContext context = new TMW_LiveContext())
            {
                FormattableString query = $"EXEC dbo.getsystemnumber @p_controlid = 'fgtbycmp', @p_alternateid = ''";
                CancellationToken cancellationToken = default;
                int newId = await context.Database.ExecuteSqlInterpolatedAsync(query, cancellationToken);

                return newId;
            }

        }

像這樣稱呼

int newId = getNewId().Result;

我遇到的問題是總是返回值 1,無一例外。 我還嘗試了非異步調用 (context.Database.ExecuteSqlInterpolated(query)) 並使用了 ExecuteSqlRaw。 結果我總是得到 1。 但是如果我在 SQL Server 中運行存儲過程,我會得到我期望的值(值看起來像這樣:13798303)。 我究竟做錯了什么? 我怎樣才能讓它返回正確的整數值?

編輯——需要注意的一件事是 sproc 做了兩件事:它從 systemcontrol 返回 sys_controlnumber,然后遞增 sys_controlnumber。 后者正在運行,這很好,所以我知道它正在調用存儲過程,但我永遠無法讓它返回同樣重要的 sys_controlnumber。

我最終沒有使用存儲過程來獲取數據。 正如所指出的,這是一種不好的做法。 這個特定的存儲過程是由第三方桌面應用程序創建並用於檢索數據的,所以我最初的想法是做同樣的事情,但它在 ASP.NET Core 3.0 中不起作用。 我找到了一種不同的方法來查詢數據並使用存儲過程來增加值(增加值是原始存儲過程正在做的另一件事)。

NineBerry 是正確的,因為 ExecuteSqlInterpolatedAsync 總是返回受影響的行數,因此您始終會得到 1 值。 您必須提供一個 OUT 參數。

SQL 過程需要使用 out 參數編寫,以便 OUT 參數正常工作。 如果您不想更改該過程,因為它正被其他系統使用,則編寫一個包裝過程來調用該過程,並將結果分配給一個 OUT 參數,該 OUT 參數與在ExecuteSqlInterpolatedAsync 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM