sql - 代码内部的事务

标签 sql vb.net winforms transactions

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

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

  • 我知道有Transaction for SQL可以使用,我知道如何使用它,但我不能真正使用它,因为用户必须执行可能取消此交易的操作。
  • 我还记得TransactionScope从 .NET 2.X 及以上可以实现类似的东西,我也知道如何使用它。问题来自 TransactionScope 和 MSDTC。使用它时,我们仍然收到一条错误消息:

  • 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/

    相关文章:

    MySQL根据多列的值进行选择

    sql - 用作表达式的子查询返回的多行

    vb.net - 在 Visual Basic 中何时使用 CDbl 和 CStr 函数

    c# - 如何保护asp :textbox from user input?

    c# - 切换到此窗口

    sql - 在内存中运行时查看 grails 模式?

    mysql - 按元素后排序

    c# - 从文件路径中删除 'head' 目录

    c# - Windows 窗体 - 如何从整个集合中排除按钮

    c# - 如何在 Windows 窗体中制作窗体模态?