代码内部的交易

时间:2012-05-04 17:04:58

标签: sql vb.net winforms transactions

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

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

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

  2. 我还记得.NET 2.X中的TransactionScope,并且可以通过它来实现类似的东西,我也知道如何使用它。 TransactionScope和MSDTC带来了问题。使用此功能时,我们仍会收到错误消息:

  3.   

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

    我已经尝试过这里描述的内容in another stack post并且效果很好......直到用户重新使用他们的计算机。每当用户重新启动计算机时,他们必须重新获得价值。另外,默认情况下,没有计算机将此值设置为“开”。至少在10个计算机基础上,没有一个被激活。有300台计算机可以安装这个程序,因此它们肯定不是好东西。

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

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

    NOTE2 :对不起我的英语,我通常会说法语。

    NOTE3 :C#中的任何例子都可以提供,因为我知道VB和C#。

1 个答案:

答案 0 :(得分: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
如果用户选择“Oui”,VB代码会将一个字符串添加到某个canceledGoods列表中。我不熟悉VB.Net;在c#中它看起来像:

canceledGoods.Add (string.Format("exec dbo.CancelGood {0}", goodID));

然后,如果cancelGoods中至少有一个字符串,则构建并执行批处理:

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);