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を返します。また、私が抱えているもう1つの問題は、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を使用するには、Return1の代わりに試してください

MSSQLの2番目の問題については、trycatchブロックを使用することをお勧めします。

これは私が使用しているものであり、ベストプラクティスかどうかはわかりませんが、より多くの可能性があり、エラーをログに記録したり、メッセージのテキストをカスタマイズしたりできます

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 に答える