2012-04-26 179 views
1

我有一个使用事务的SQL查询,并使用返回指示失败或成功,就像这样:的ExecuteScalar返回null

BEGIN 

    DECLARE @intErrorCode INT; 
    DECLARE @emailAutoIncrement INT; 

    BEGIN TRAN 


    INSERT INTO Accounts (blabla, blabla2) 
    VALUES (somevalue, somevalue2) 

    Select @intErrorCode = @@ERROR 
    if (@intErrorCode <> 0) GOTO PROBLEM 

    COMMIT TRAN 
    RETURN 1 


    PROBLEM: 
    if (@intErrorCode <> 0) Begin 
    Rollback Tran 
    RETURN 0 
    END 

END 

从代码,我用sqlCommand.ExecuteScalar()认为这会给我1或0,但这总是返回false。另外,我遇​​到的另一个问题是,当sql中发生异常并且程序要返回0时,它实际上会返回异常。

那么RETURN 0是无用的,因为它总是被异常覆盖?

要添加一些更多的信息,SQL查询是一个存储过程,它被称为像这样:

   myCommand.CommandText = "createAccount"; 
       myCommand.CommandType = CommandType.StoredProcedure; 
       //Add parameters here 
       using (myReader) 
       { 
        var test = myCommand.ExecuteScalar(); 
       } 
+1

您是否尝试过在事务范围内移动变量声明? – 2012-04-26 11:48:50

+0

为什么?这似乎没有关系。事务工作并返回从SQL Management Studio运行时的值,问题出自我的C#代码。 – TheGateKeeper 2012-04-26 11:52:49

+0

尝试SET @intErrorCode = @@ ERROR而不是SELECT - 请参阅我的答案以获得完整解决方案 – DaveHogan 2012-04-26 11:57:05

回答

3

的文本尝试SELECT而不是RETURN

BEGIN 

    DECLARE @intErrorCode INT; 
    DECLARE @emailAutoIncrement INT; 

    BEGIN TRAN 


    INSERT INTO Accounts (blabla, blabla2) 
    VALUES (somevalue, somevalue2) 

    SET @intErrorCode = @@ERROR 
    if (@intErrorCode <> 0) GOTO PROBLEM 

    COMMIT TRAN 
    SELECT 1 


    PROBLEM: 
    if (@intErrorCode <> 0) Begin 
    Rollback Tran 
    SELECT 0 
    END 

END 

我也改变

SELECT @intErrorCode = @@ERROR 

SET @intErrorCode = @@ERROR 
+0

谢谢,解决了双重错误。我发现我可以使用'@ RETURN_VALUE'并以正确的方式执行,但是要感谢这些信息。 – TheGateKeeper 2012-04-26 12:11:02

1

尝试,而不是返回1使用选择1

对于MSSQL第二个问题建议使用try catch块。

这是我用的,不知道这是否是最好的做法,但它允许更多的可能性,你可以记录错误,自定义消息

BEGIN TRY... 
END TRY 
BEGIN CATCH 
    declare @ErrorMessage nvarchar(4000),@ErrorSeverity int,@ErrorState int 
    select @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState=ERROR_STATE() 
    set @ErrorState=case when isnull(@ErrorState,0) <1 then 1 else @ErrorState end 
    raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState); 
END CATCH 
+0

嗯......想一想,回报并非真的需要。我只能看到例外情况。查询正确执行的唯一时间是没有例外。或者这是不好的编程习惯?我可以至少取消回滚的回报。 – TheGateKeeper 2012-04-26 12:07:52