简体   繁体   English

弹出警报消息时如何在SQL存储过程中停止事务

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

Based on below C# code i have wrote the statement in SQL stored procedure when inv_qty == 2 , to pop up alert message. 基于下面的C#代码,我在inv_qty == 2时在SQL存储过程中编写了语句,以弹出警报消息。

But after showing the alert message.The data transaction has been recorded.How to stop the transaction if pop up the alert message is active? 但是在显示警报消息后。数据事务已被记录。如果弹出警报消息,如何停止事务?

As i know SQL stored procedure is not able to stop the transaction if write the statement, How can i achieve this? 据我所知,如果编写语句,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

You cannot pause initiated transaction, you need to split up your procedure into two parts and call the second after your popup or whatever condition you feel like. 您无法暂停已启动的交易,您需要将您的程序分成两部分,并在弹出后或您想要的任何条件下调用第二部分。

If you want to rollback transaction you an use BEGIN TRAN and COMMIT/ROLLBACK respectively. 如果要回滚事务,则分别使用BEGIN TRAN和COMMIT / ROLLBACK。 .NET Transactions can also be used for rollback. .NET 事务也可用于回滚。

You wrote when inv_qty == 2 but your procedure returns @RecordFound and based on my understanding of the sql everything is fine if @InvFindQTY >= @INV_QTY and the proc returns @RecordFound = 2 when inv_qty == 2但是你的程序返回@RecordFound ,根据我对sql的理解,如果@InvFindQTY >= @INV_QTY并且proc返回@RecordFound = 2一切都很好

  • The value @INV_QTY is passed to the procedure @INV_QTY将传递给过程
  • the column inv_qty of the table oth_inv_qty_loc is updated inv_qty = inv_qty - @INV_QTY if the condition inv_id = @INV_ID AND inv_location = @INV_LOCATION is given 如果条件inv_id = @INV_ID AND inv_location = @INV_LOCATION ,则表oth_inv_qty_loc的列inv_qty更新为inv_qty = inv_qty - @INV_QTY
  • the value of @InvFindQTY = (SELECT inv_qty FROM oth_inv_qty_loc) is retrieved after the update 更新后检索@InvFindQTY = (SELECT inv_qty FROM oth_inv_qty_loc)
  • and @RecordFound is set depending on @InvFindQTY >= @INV_QTY @RecordFound被设置为根据@InvFindQTY >= @INV_QTY

So basically it seems that you can wrap the statement in a transaction and update the table only if inv_qty >= @INV_QTY which means if the current stock is greater or equal the amount @INV_QTY which someone wants to take out of the stock. 所以基本上你似乎可以在事务中包装语句并仅在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