我遇到了一个问题,我不确定如何解决这个问题,我想知道为了完成这项任务我应该考虑的最佳方法是什么。
我们正在开发应用程序 VB.net 2.0 和 SQL 2005。允许用户根据可能包含许多已收到商品的购买取消接收。但是,在取消的过程中,会向用户提出一些问题,例如“您要取消 Good #1”。如果是,请删除。然后,“你想取消Good#2”,不,不要删除,然后是另一个问题(如果收到的项目发出,必须由用户手动进行一个过程)。最后,如果所有商品都是成功取消,我们必须取消接收本身。但是有时候,如果在这个过程中曾经向用户询问过错误或某些情况发生,我们希望取消从一开始所做的任何 Action ,并使其恢复到原来的状态。所以我想到了Transaction
.
Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool.
我试过这里描述的内容in another stack post它工作得很好......直到用户重新启动他们的计算机。每次用户重新启动计算机时,他们都必须恢复值(value)。另外,默认情况下,没有计算机将此值设置为“开”。至少有 10 个计算机基地没有被激活。大约有 300 台计算机安装了这个程序,所以这肯定不是好事。
所以有人知道我如何实现这一目标吗?还有什么其他东西可以通过我可以使用的代码进行交易吗?
注1 : 我知道有人会说,首先向用户询问条件并在内存中维护值。完成后,如果一切顺利,请使用删除。但是,如果在删除商品 #4 时发生错误怎么办?以及如何为存储程序提供要删除的商品的动态列表?
注2 : 对不起我的英语,我通常说法语。
注3 :C# 中的任何示例也可以提供,因为我知道 VB 和 C#。
最佳答案
假设您已经有类似的存储过程来管理取消:
create proc CancelGood (@goodID int)
as
SET NOCOUNT ON
SET XACT_ABORT ON
begin transaction
update table1 set canceled = 1
where GoodID = @GoodID
update table2 set on_stock = on_stock + 1
where GoodID = @GoodID
commit transaction
VB 代码将字符串添加到一些
canceledGoods
如果用户选择“Oui”,则列出。我不熟悉 VB.Net;在 c# 中它看起来像:canceledGoods.Add (string.Format("exec dbo.CancelGood {0}", goodID));
然后,如果 cancelledGoods 中至少有一个字符串,则构建并执行批处理:
batch = "BEGIN TRANSACTION" +
" BEGIN TRY " +
string.Join (Environment.NewLine, canceledGoods.ToArray()) +
" END TRY" +
" BEGIN CATCH " +
" -- CODE TO CALL IF THERE WAS AN ERROR" +
" ROLLBACK TRANSACTION" +
" RETURN" +
" END CATCH" +
" -- CODE TO CALL AFTER SUCCESSFULL CANCELATION OF ALL GOODS" +
" COMMIT TRANSACTION"
conn.ExecuteNonQuery (batch);
关于sql - 代码内部的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10453169/