RAISERROR和ROLLBACK交易

时间:2011-02-03 01:38:29

标签: asp.net sql

我想在asp.net页面中使用sp作为以下内容。

如何在sp.net中显示错误消息?

通过调用sp?

在asp.net中执行任务的任何DAL属性示例

在sp中使用RAISERROR和ROLLBACK TRANSACTION之间是否存在冲突?

ALTER PROCEDURE [dbo].[Cyrex_ChangeUsername]

@oldName nvarchar(128),
@newName nvarchar(128)

AS

declare @error_var int, @rowcount_var int
declare @newNameCount int

begin transaction

 select @newNameCount = count(*)
  from Users
  where Username = ltrim(rtrim(@newName))
 if @newNameCount > 0 
 begin
  RAISERROR('Username already exists. @newName=%s', 10, 1, @newName) 
  ROLLBACK TRANSACTION
  RETURN
 end

 update Users
 set Username = ltrim(rtrim(@newName))
 where Username = ltrim(rtrim(@oldName))

 SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT
 IF @rowcount_var <> 1 OR @error_var <> 0
 BEGIN
  RAISERROR('Could not Update User.Username. @oldName=%s', 10, 1, @oldName) 
  ROLLBACK TRANSACTION
  RETURN
 END


 update aspnet_Users
 set 
  Username = @newName,
  LoweredUserName = LOWER(@newName)
 where LoweredUserName = LOWER(@oldName)

 SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT
 IF @rowcount_var <> 1 OR @error_var <> 0
 BEGIN
  RAISERROR('Could not Update aspnet_Users.Username. @oldName=%s', 10, 1, @oldName) 
  ROLLBACK TRANSACTION
  RETURN
 END

Commit transaction

1 个答案:

答案 0 :(得分:1)

我认为问题在于您在Raiserror上使用severity level 10

10或更低的严重性不允许在.NET代码中捕获异常。

在你的proc中,如果这些条件是错误的,会建议你增加严重性,以便在.NET中捕获异常。

通过在连接上订阅InfoMessage event,可以检测到小于10的严重性 - 示例为here