我遇到了一个问题,我不知道如何解决这个问题,我想知道为了完成这项任务我应该考虑什么是最好的方法。
我们正在开发一个应用程序VB.net 2.0和SQL 2005.允许用户根据可能包含许多收到的商品的购买取消接收。但是,在取消过程中,会向用户询问一些问题,例如“你想取消好#1”。如果是,请删除。然后,“你想要取消好#2”,不,不要删除和另一个问题(如果收到项目,则必须由用户手动制作一个过程)。最后,如果所有商品都成功取消,我们必须取消接收。但有时候,如果在此过程中向用户询问时发生错误或出现某些情况,我们希望取消从开头做出的任何操作并使其恢复到原始状态。所以我想到了Transaction
。
我知道有Transaction for SQL可以使用,我知道如何使用它,但我不能真正使用它,因为用户必须执行可能取消此事务的操作。
我还记得.NET 2.X中的TransactionScope,并且可以通过它来实现类似的东西,我也知道如何使用它。 TransactionScope和MSDTC带来了问题。使用此功能时,我们仍会收到错误消息:
已禁用分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问。
我已经尝试过这里描述的内容in another stack post并且效果很好......直到用户重新使用他们的计算机。每当用户重新启动计算机时,他们必须重新获得价值。另外,默认情况下,没有计算机将此值设置为“开”。至少在10个计算机基础上,没有一个被激活。有300台计算机可以安装这个程序,因此它们肯定不是好东西。
所以任何人都知道如何实现这一目标?还有什么东西可以通过我可以使用的代码进行交易吗?
NOTE1 :我知道有人会说,首先向用户询问条件并维护内存中的值。完成后,如果一切顺利,请使用删除。但是如果在删除货物#4时发生错误怎么办?如何为商店程序提供要删除的动态商品清单?
NOTE2 :对不起我的英语,我通常会说法语。
NOTE3 :C#中的任何例子都可以提供,因为我知道VB和C#。
答案 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);