[英]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
一切都很好
@INV_QTY
is passed to the procedure @INV_QTY
将传递给过程 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
@InvFindQTY = (SELECT inv_qty FROM oth_inv_qty_loc)
is retrieved after the update @InvFindQTY = (SELECT inv_qty FROM oth_inv_qty_loc)
值 @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.