SQL Server SQL 存储过程主动抛出异常

xinggang · 2016年09月04日 · 260 次阅读

使用场景:**

当需要通过 DataSource.ExecSql() 执行存储过程,如果存储过程执行中满足一定条件需要中止执行(比如没有找到生产物流号),并将提示信息返回给客户端,则可在存储过程中主动抛出异常,示例代码如下。

C# 代码片段:

if(DataSource.ExecSql(ht)["IsSuccess"].Equals("0")) return;
**SQL 存储过程片段:**

SQL 存储过程片段:

select @Scwlh=Scwlh from WS_Prcj_Rsjhdd where Rsjhid='2017001'
if @@ROWCOUNT=0
begin
    set @ErrorMsg='没有找到生产物流号!'
    raiserror(@ErrorMsg,11,1) --如果没有取到“生产物流号”不能继续执行,则主动抛出异常
    return
end

这里主要用到了 SQL Server 的 raiserror 函数,可查阅相关资料:http://www.cnblogs.com/xugang/archive/2011/04/09/2010216.html

经测试,通过 raiserror 主动抛出异常后之前的更新操作不会回滚,如果需要回滚请调用 rollback 语句(如果通过 PEMSoft 开发框架中的 WnDataSource 执行 SQL 语句则不需要写 rollback,因为 WnDataSource 的 Execsql 和 UpdateDataSet 方法中已经对事务的支持进行了封装)。

select @Scwlh=Scwlh from WS_Prcj_Rsjhdd where Rsjhid='2017001'
if @@ROWCOUNT=0
begin
    set @ErrorMsg='没有找到生产物流号!'
    raiserror(@ErrorMsg,11,1) --如果没有取到“生产物流号”不能继续执行,则主动抛出异常
    rollback --回滚
    return
end

对于 Rollback 的补充,可以用 SET XACT_ABORT ON 实现整体回滚,详情请自行查阅资料。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册