簡體   English   中英

彈出警報消息時如何在SQL存儲過程中停止事務

[英]How to stop transaction in SQL stored procedure when pop up alert message

基於下面的C#代碼,我在inv_qty == 2時在SQL存儲過程中編寫了語句,以彈出警報消息。

但是在顯示警報消息后。數據事務已被記錄。如果彈出警報消息,如何停止事務?

據我所知,如果編寫語句,SQL存儲過程無法停止事務,我該如何實現呢?

 float INV_QTY = Convert.ToInt32(_cmd.Parameters["@RecordFound"].Value.ToString());
                   if (INV_QTY == 2)
                 {
         ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('" + Item + " Qty is more than exist Qty');window.location.href = 'MMS_Issue.aspx';", true);
                    }
    USE [CIMProRPT01]
     GO
    SET ANSI_NULLS ON
     GO
   SET QUOTED_IDENTIFIER ON
       GO
     ALTER PROCEDURE [dbo].[MMSIssue_InsertOrUpdate] 
     @INV_TRANS_ID VARCHAR(40)
     ,@INV_ID VARCHAR(40)
      ,@INV_LOCATION VARCHAR(40) 
      ,@INV_QTY FLOAT
      ,@INV_TRANS_REQUESTOR VARCHAR(40)
      ,@INV_TRANS_REFNO VARCHAR(40)
      ,@INV_TRANS_REMARK VARCHAR(255)
      ,@INV_REASON_ID VARCHAR(40)
     ,@INV_REASON_REMARK VARCHAR(255)
      ,@INV_CREATE_DATE DATETIME
       ,@INV_CREATE_USER VARCHAR (255)

       ,@INV_FROMLOC VARCHAR (40)
        ,@RecordFound INT OUTPUT
      AS
         BEGIN
      SET NOCOUNT ON;

IF EXISTS(SELECT * FROM OTH_INV_QTY_LOC WHERE INV_ID = @INV_ID and INV_LOCATION = @INV_LOCATION)
BEGIN
    UPDATE OTH_INV_QTY_LOC SET [INV_ID] = @INV_ID,INV_LOCATION = @INV_LOCATION , INV_QTY = INV_QTY - @INV_QTY WHERE INV_ID = @INV_ID AND INV_LOCATION = @INV_LOCATION

    INSERT INTO OTH_INV_TRANSACTION (INV_TRANS_ID,INV_ID,INV_TRANS_LOCATION,INV_TRANS_QTY,INV_TRANS_REQUESTOR,INV_TRANS_REFNO,INV_TRANS_REMARK,INV_REASON_ID,INV_REASON_REMARK,INV_CREATE_DATE,INV_CREATE_USER,INV_FROMLOC)VALUES (@INV_TRANS_ID,@INV_ID,@INV_LOCATION,@INV_QTY,@INV_TRANS_REQUESTOR,@INV_TRANS_REFNO,@INV_TRANS_REMARK,@INV_REASON_ID,@INV_REASON_REMARK,@INV_CREATE_DATE,@INV_CREATE_USER,@INV_FROMLOC)


    DECLARE  @InvFindQTY FLOAT SET @InvFindQTY = ( SELECT INV_QTY FROM OTH_INV_QTY_LOC)

    IF  @InvFindQTY >= @INV_QTY 
    BEGIN
        SELECT @RecordFound = 2
    END
ELSE
    BEGIN
        SELECT @RecordFound = 1
    END
END
      ELSE 
      BEGIN
           SELECT @RecordFound = 0
   END
         END

您無法暫停已啟動的交易,您需要將您的程序分成兩部分,並在彈出后或您想要的任何條件下調用第二部分。

如果要回滾事務,則分別使用BEGIN TRAN和COMMIT / ROLLBACK。 .NET 事務也可用於回滾。

when inv_qty == 2但是你的程序返回@RecordFound ,根據我對sql的理解,如果@InvFindQTY >= @INV_QTY並且proc返回@RecordFound = 2一切都很好

  • @INV_QTY將傳遞給過程
  • 如果條件inv_id = @INV_ID AND inv_location = @INV_LOCATION ,則表oth_inv_qty_loc的列inv_qty更新為inv_qty = inv_qty - @INV_QTY
  • 更新后檢索@InvFindQTY = (SELECT inv_qty FROM oth_inv_qty_loc)
  • @RecordFound被設置為根據@InvFindQTY >= @INV_QTY

所以基本上你似乎可以在事務中包裝語句並僅在inv_qty >= @INV_QTY更新表,這意味着當前股票是否大於或等於某人想要從股票中取出的金額@INV_QTY

ALTER PROCEDURE [dbo].[MMSIssue_InsertOrUpdate]
    @INV_TRANS_ID VARCHAR(40)
    ,@INV_ID VARCHAR(40)
    ,@INV_LOCATION VARCHAR(40) 
    ,@INV_QTY FLOAT
    ,@INV_TRANS_REQUESTOR VARCHAR(40)
    ,@INV_TRANS_REFNO VARCHAR(40)
    ,@INV_TRANS_REMARK VARCHAR(255)
    ,@INV_REASON_ID VARCHAR(40)
    ,@INV_REASON_REMARK VARCHAR(255)
    ,@INV_CREATE_DATE DATETIME
    ,@INV_CREATE_USER VARCHAR (255)
    ,@INV_FROMLOC VARCHAR (40)
    ,@RecordFound INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    IF EXISTS(SELECT * 
        FROM OTH_INV_QTY_LOC 
        WHERE INV_ID = @INV_ID 
            AND INV_LOCATION = @INV_LOCATION)
    BEGIN
        BEGIN TRY   
            -- start the transaction
            BEGIN TRANSACTION 

            UPDATE OTH_INV_QTY_LOC 
            SET [INV_ID] = @INV_ID,INV_LOCATION = @INV_LOCATION , INV_QTY = INV_QTY - @INV_QTY 
            WHERE INV_ID = @INV_ID AND INV_LOCATION = @INV_LOCATION

            -- you can start the transaction from here
            -- BEGIN TRANSACTION 

            INSERT INTO OTH_INV_TRANSACTION (INV_TRANS_ID,INV_ID,INV_TRANS_LOCATION,INV_TRANS_QTY,INV_TRANS_REQUESTOR,INV_TRANS_REFNO,INV_TRANS_REMARK,INV_REASON_ID,INV_REASON_REMARK,INV_CREATE_DATE,INV_CREATE_USER,INV_FROMLOC)
            VALUES (@INV_TRANS_ID,@INV_ID,@INV_LOCATION,@INV_QTY,@INV_TRANS_REQUESTOR,@INV_TRANS_REFNO,@INV_TRANS_REMARK,@INV_REASON_ID,@INV_REASON_REMARK,@INV_CREATE_DATE,@INV_CREATE_USER,@INV_FROMLOC)

            DECLARE  @InvFindQTY FLOAT 
            SET @InvFindQTY = ( SELECT INV_QTY FROM OTH_INV_QTY_LOC)

            IF  @InvFindQTY >= @INV_QTY 
            BEGIN
                SELECT @RecordFound = 2;
                THROW 51000, '@RecordFound = 2', 1; 
            END
            ELSE
            BEGIN
                SELECT @RecordFound = 1
            END
        END TRY
        BEGIN CATCH         
            ROLLBACK TRANSACTION            
        END CATCH

        -- Commit the transaction 
        IF XACT_STATE() = 1 COMMIT TRANSACTION 
        -- For safety
        ELSE IF XACT_STATE() = -1 ROLLBACK TRANSACTION 
    END
    ELSE 
    BEGIN
        SELECT @RecordFound = 0
    END
END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM