簡體   English   中英

Database.ExecuteSqlCommand()在執行存儲過程時掛起

[英]Database.ExecuteSqlCommand() Hanging On Execution of Stored Procedure

我正在使用一個我沒有太多控制權的數據庫。 我正在嘗試在C#Web API調用中使用Database.ExecuteSqlCommand方法執行存儲過程。 我已經能夠成功地在其他存儲過程上使用此方法,而沒有任何問題。 但是,當我嘗試執行此特定的存儲過程時,應用程序凍結。 我將其放在try catch中,並且不會引發任何異常。 它將無限期地保持這種狀態。 我必須進入SSMS並終止與呼叫相關的進程。 當我終止該過程時,Web API將繼續。 如果我在SSMS中執行相同的EXEC命令,則返回單個行RETURN_VALUE = 0可以很好地工作。我在過程結束時手動添加了RETURN_VALUE = 0,以為這可能是問題的一部分。

C#代碼為:

try
{
    entities.Database.ExecuteSqlCommand("EXEC [dbo].[SPCHANGEORDER]");
    return Ok();
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
    return Content(HttpStatusCode.BadRequest, "SQL Server Exception");
}

該存儲過程確實會調用其他一些存儲過程以及一些插入,更新和刪除。 我知道其中一個嵌套存儲過程也會執行幾個EXEC xp_cmdshell命令。 我知道這還不算什么,但是我希望有人可以幫助我至少找到錯誤的路徑。 謝謝!

編輯我使用了SQL Server Profiler,並發現它在哪里執行。 我將集合復制/粘貼到SSMS查詢窗口中,但仍然能夠成功執行存儲的proc。

探查器窗口

探查器窗口

SSMS查詢

SSMS查詢

默認情況下,EF將本機SQL Command調用包裝在事務中。 取決於您的存儲過程做什么,這可能是問題所在。 例如,如果您的存儲過程進行了鏈接服務器調用,則可能導致它需要分布式事務。

我懷疑這里發生的事情是事務導致無法檢測到的死鎖,因為您的過程正在調用xp_cmdshell。 如果該外部程序試圖讀取您的存儲過程寫入的數據,則將其包裝在事務中將導致該外部程序看不到您的更改,或者阻止您未提交的事務。 (由於您存儲的proc使用xp_cmdshell間接創建第二個連接,因此SQL Server無法檢測到死鎖。)

無論如何要禁用事務,請嘗試:

entities.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
entities.Database.ExecuteSqlCommand("EXEC [dbo].[SPCHANGEORDER]");

暫無
暫無

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

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