2011-02-03 3 views
0

sp를 asp.net 페이지에서 다음과 같이 사용하고 싶습니다.RAISERROR 및 ROLLBACK TRANSACTION

sp에서 오류 메시지를 asp.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 
+0

어떤 버전의 SQL Server를 사용 하시겠습니까? – gbn

답변

1

나는 문제가 당신이 당신의 RAISERROR에 severity level 10을 사용하고 있다고 생각합니다.

심각도가 10 이하인 경우 .NET 코드에 예외가 트랩되지 않습니다.

proc에서 이러한 조건이 오류 인 경우 예외를 .NET에서 발견 할 수 있도록 심각도를 높이는 것이 좋습니다.

연결에서 InfoMessage event을 구독하면 심각도가 10보다 작습니다. 예는 here입니다.

+0

UR 도움말을위한 Thx. 나는 또 다른 질문이있다. 난 그냥 asp.net.SQL 서버 및 SQL과 네트워크의 성능을 줄이기 위해 작업을 무거운 의무에 SQL을 통해 오류를 다시 보내는 것에 대한 귀하의 아이디어를 알고 싶어요? 또는 SQL에서 오류 처리를 사용하는 Insted BLL에서 동일한 프로세스를합니까? – arlen

+0

요즘은 BLL 또는 이와 유사한 코드 관련 비즈니스 로직을 사용하는 경향이 있습니다. 특히 LINQ2SQL 및 EF와 같은 기술을 사용하는 경우에는 자신의 규칙을 구현하는 데 필요한 코드 줄이 SPROC에서 수행하는 것보다 적습니다. 그러나 SPROC (2.5 계층 아키텍처라고도 함)에 논리를 사용하는 많은 시스템이 있으므로 SPROC에 시스템의 대부분을 이미 가지고 있다면 나는 그대로 둡니다. 그러나 BLL 경로를 선택하면 .NET TransactionScope를 사용하여 트랜잭션을 관리하는 것이 좋습니다. – StuartLC

관련 문제