透過EF呼叫SP,SP中的throw無法拋回前端,就像exception被吃掉了一樣
昨天和同事在看一個問題,依照慣例,我們在sp透過throw關鍵字都可以把控制權交還給client(因為throw的層級=16),
這時我們可以在C#的catch block來控制錯誤邏輯的處理,但如果你有用到OUTPUT子句的話,可能就需要繞路了。
--Sp
alter proc usp_updnumber(@c1 int,@c2 varchar(10))
as
set nocount on;
set xact_abort on;
begin tran
update mynumbers set c2=@c2
output inserted.c2
where c1=@c1
if @@ROWCOUNT=0
throw 51000,'Data not found',1;
commit
--單獨測試SP一切正常
exec usp_updnumber 6,'newrico'
現在透過C#,前端呼叫該SP如下
await ThrowTest(6, "newrico");
沒想到一切正常,居然沒有進入catch block,後來同事發現,EF在Query時,
只要可以正常取得第一個結果集就不會出錯,知道這特性後,我目前是先透過table variable來解決這問題
alter proc usp_updnumber(@c1 int,@c2 varchar(10))
as
set nocount on;
set xact_abort on;
declare @tmp table(c2 varchar(10));
begin tran
update mynumbers set c2=@c2
output inserted.c2 into @tmp
where c1=@c1
if @@ROWCOUNT=0
throw 51000,'Data not found',1;
commit
select * from @tmp
當資料沒有異動,可以正常進入catch block,我們才可以後續處理錯誤邏輯
當資料有異動,當然也可以正常收到結果