3

我遇到了一个问题,我不确定如何解决这个问题,我想知道为了完成这项任务我应该考虑的最佳方法是什么。

我们正在开发一个应用程序 VB.net 2.0 和 SQL 2005。允许用户根据可能包含许多已接收商品的购买取消接收。但是,在取消的过程中,会向用户提出一些问题,例如“您要取消 Good #1”。如果是,请删除。然后,“你想取消Good#2”,不,不要删除,再问一个问题(如果收到的项目发出,必须由用户手动进行一个过程)。而且,最后,如果所有货物都成功取消,我们必须取消接收本身。但是有时候,如果在这个过程中曾经向用户询问过错误或某些情况发生,我们希望取消从一开始所做的任何动作,并使其恢复到原来的状态。于是我想了想Transaction

  1. 我知道有可以使用的 SQL 事务,并且我知道如何使用它,但我不能真正使用它,因为用户必须执行可能取消此事务的操作。

  2. 我还记得.NET 2.X 中的TransactionScope,它可以实现类似的功能,我也知道如何使用它。问题来自 TransactionScope 和 MSDTC。使用它时,我们仍然收到错误消息:

分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问。

我已经尝试过在另一个堆栈帖子中描述的内容并且效果很好......直到用户重新启动他们的计算机。每次用户重新启动计算机时,他们都必须恢复价值。另外,默认情况下,没有计算机将此值设置为“开”。至少有 10 个计算机基地没有被激活。大约有 300 台计算机安装了这个程序,所以这肯定不是好事。

所以有人知道我如何实现这一目标吗?还有什么其他东西可以通过我可以使用的代码进行交易吗?

NOTE1:我知道有人会说,首先向用户询问条件并在内存中维护值。完成后,如果一切顺利,请使用删除。但是,如果在删除商品 #4 时发生错误怎么办?以及如何为存储程序提供要删除的商品的动态列表?

注2:对不起我的英语,我通常说法语。

注 3:C# 中的任何示例也可以提供,因为我知道 VB 和 C#。

4

1 回答 1

1

假设您已经有类似的存储过程来管理取消:

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

canceledGoods如果用户选择“Oui” ,VB 代码会在某个列表中添加一个字符串。我不熟悉 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);
于 2012-05-04T17:45:50.947 回答