2012-05-04 25 views
3

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

我们正在开发一个应用程序VB.net 2.0和SQL 2005.用户可以根据可能包含许多收到商品的购买取消接收。但是,在取消过程中,会向用户询问一些问题,例如“您是否想取消良好#1”。如果是,请删除。然后,“您是否想要取消良好#2”,否,不要删除和另外一个问题(如果接收到的项目发出,则必须由用户手动进行处理)。最后,如果所有商品都是成功取消,我们必须取消接待本身。但有时候,如果在这个过程中有一个错误发生或者一旦有人要求用户发生某些情况,我们就要取消从开始阶段开始的任何操作并将其恢复到原始状态。所以我想到了Transaction

  1. 我知道有Transaction for SQL可以使用,我知道不够好如何使用它,但我不能真的使用它作为用户必须执行其可能取消这笔交易的行为。

  2. 我还记得.NET 2.X中的TransactionScope,它可以实现类似的功能,我也知道如何使用它。问题出现在TransactionScope和MSDTC中。当使用此,我们仍然得到一个错误,说:

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

我试过这里描述的是in another stack post,它的工作原理非常好......直到用户放弃了他们的计算机。每当用户重新启动计算机时,他们都必须将价值放回原处。另外,默认情况下,没有计算机将此值设置为开。至少在10台计算机基础上,没有一个被激活。有300台电脑安装了这个程序,所以它肯定不是好的事情。

因此,任何人都有我如何实现这一目标的想法?还有其他事情可以通过我可以使用的代码进行交易吗?

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

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

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

+0

如果你NOTE1说什么,使嵌入删除入事务和回退如果发生错误。有关批处理中自动回滚的详细信息,请参见[SET XACT_ABORT ON](http://msdn.microsoft.com/zh-cn/library/ms188792%28v=sql.90%29.aspx)。 –

+0

是的,但我仍然有可能从#A接收中取消良好#1,3,4,5,8的问题。我如何将动态数组传递给存储过程?有没有办法? –

+0

在sql server中有XML数据类型,所以可以将各种事情作为XML参数传递。但我在想,您可以自己构建sql语句以响应用户操作和此批处理的'ExecuteNonQuery'。 –

回答

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 

VB代码添加一个字符串,一些canceledGoods列表中,如果用户选择“OUI”。我不熟悉VB。净;在C#中它会看起来像:

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

比,如果在canceledGoods至少一条绳,建立和执行批处理:

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

对于C#来说没问题,我以前在这个项目之前只做了C#,所以我非常喜欢这两个。我会试着写下你以后回来的内容。但是,我确实有很多工作要做,因为我只解释了我的一小部分问题。我必须回想一下如何使用这些方法来做到这一点。可能对我来说更容易使用第二部分,因为我比较熟悉与SQL相比较的.NET代码。 –