1

我有一个使用事务的 sql 查询,它使用 return 来指示失败或成功,如下所示:

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();
                }
4

2 回答 2

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
于 2012-04-26T11:53:03.267 回答
1

尝试使用 Select 1 而不是 Return 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
于 2012-04-26T11:53:00.987 回答