2011-07-25 73 views
1

我写在下面的方式存储过程返回..catch错误消息从SQL Server存储过程在前端

CREATE PROCEDURE spTest 
@intCompId  int, 
@varCompName varchar(50) 
AS 
BEGIN 
BEGIN TRANSACTION 
BEGIN TRY 
    INSERT INTO tblCompanyMaster(CompId,CompName) 
    VALUES (@intCompId,@varCompName) 
    IF(@@ERROR<>0) 
     RAISERROR('Error',10,1) 
     SELECT ERROR_MESSAGE() 

    IF(@@ERROR=0) 
    BEGIN 
     COMMIT TRANSACTION 
     SELECT 0; 
    END 
    ELSE 
     ROLLBACK TRANSACTION 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH 
END 
GO 

我如果发生错误,将返回错误信息这种情况下。我使用sqlcommand属性(如oSqlcommand.executeNonQuery())从前端调用此sp;它将返回不受影响的行,否则返回零。现在我想要的是,如果在存储过程中出现错误,而不是由error_message()返回的消息应作为异常捕获在前端,并且因为我在文本文件中写入每个异常。我怎样才能在前端捕捉到这条消息? 我的编码风格是如下....

try 
{ 

    //Some code 

} 
catch(exception ex) 
{ 

    //Write exception in text file. 

} 

我想处理该消息在恩。

回答

5

你的存储过程中包含一个根本缺陷:

如果你检查的@@ERROR(或@@ROWCOUNT)的值后,再执行任何声明,它就会被重置为零。

你应该始终缓存在本地变量之前继续:

DECLARE @errornum int 
SET @errornum = @@ERROR 

如果需要行数为好,那么你必须在一个单独的语句,像这样

SELECT @errornum = @@ERROR, @rowcount = @@ROWCOUNT 

除了表演,你应该不需要混合TRY/CATCH并检查@@ERROR

如果要在处理错误时使用TRY/CATCH存储过程,例如:

BEGIN TRY 
    -- ... 
    -- Do Stuff 
    -- ... 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_MESSAGE() AS ErrorMessage; 
END CATCH 

在你的C#代码,赶上SqlException

+0

..我无法理解你的第一条语句“你的存储过程中包含一个根本缺陷”。此外,我不明白你想通过这个答案说的话。你能否详细说明一下。我不想在程序中获得行数。我使用Try/Catch来处理事务,并使用@@ ERROR来获取错误消息。 –

+0

我已经细化了。不知道什么是不明白... –