Mat*_*s F 5 c# t-sql ado.net sql-server-2008
我继承了看起来像这样的代码:
存储过程UpdateSomeStuff
Update Table1 Set Col1=Para@1
IF @@Error > 0 Goto ERR
Update Table2 Set Col1=Para@2
IF @@Error > 0 Goto ERR
RETURN 0
ERR:
return -1;
Run Code Online (Sandbox Code Playgroud)
这个sp由ADO.NET在c#中调用,就像这样
try
{
myCommand.ExecuteNonQuery();
}
catch (System.Exception ex)
{
_log.Error(ex);
throw();
}
finally
{
if(myConnection!=null)
{
myConnection.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
我只是问自己:部分是IF @@错误> 0转到ERR有什么好处?如果发生错误,则无论如何都会返回sp,并且会在调用方法中捕获异常.
调用代码不处理返回值0和-1.我的计划是删除存储过程中的所有错误处理,并获得相同的结果.我是对的还是我错过了什么?
更好的方法(SQL Server 2005以上)是使用TRY..CATCH
:
BEGIN TRY
-- Perform operations here
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage;
END CATCH
Run Code Online (Sandbox Code Playgroud)
一个很好的参考是:SQL 2005及更高版本中的错误处理
我的“2 美分”你会通过删除 if@error 语句来降低性能。因此,要么按照米奇所说的那样实现 try catch,要么不删除它们。试想一下,如果第一个语句有错误,那么当您有 if@error 语句时,它不会尝试执行第二个语句,依此类推。
如果删除它们,sql server 将尝试下一条语句,直到达到限制,此时它决定无法继续进行进一步处理。