类型化数据集中的事务

Posted

技术标签:

【中文标题】类型化数据集中的事务【英文标题】:Transactions in Typed DataSets 【发布时间】:2011-05-28 07:57:36 【问题描述】:

有一个包含多个相关表的类型化数据集,以及这些表之间定义的关系。在处理数据馈送时,我正在添加、修改和删除记录,然后在每个表上调用更新。

Requests        Reapprovals        UserRole
 RequestId ----- RequestId    ----- RoleId 
 Reason          RoleId  ----/      UserId 

使用类型化数据集的原因是我必须检查现有数据以确定我是否正在添加、修改或删除记录......所以我需要我正在使用的所有内容的完整转储(替代当我一一处理记录时,将对数据库进行 10,000 次查询)。

我想要事务支持,但我没有找到使用类型化数据集的方法。例如,我在创建新的重新批准时创建了一个新请求。但如果重新批准未能更新,我不想保留该请求。

将更新调用放在TransactionScope 下意味着如果任何记录失败,它们都会失败。不是我想要的。

如何提交或回滚类型化数据集中的相关行?

【问题讨论】:

您可能会感兴趣的是,对表调用 Update 确实会向数据库发送 N 个查询,每个查询对应于您要更新/添加/删除的每条记录。因此,通过在表上调用 Update 或在每次更改单行时调用 Update,您并没有真正获得很多好处。 (使用“批量”发送选项可能会有一些好处,但我不知道有多重要)因此,虽然您确实可以使用完整的内存转储来确定要修改哪些记录,但我建议包装每一系列操作在自己的事务范围内记录。 知道行一次更新一个,并考虑在我修改它们时一次更新一个行......让我烦恼的是我在桌子上调用 Update(),它检查每一行以查看它是否需要更新。这意味着我要迭代 10,000+ 行 10,000+ 次以找到已更新的一行。不确定这种性能影响是巨大还是微不足道。 Pandincus> 如果您想输入您所说的作为答案,我会接受。看起来我的选择是通过执行您的建议来降低性能,或者接受/拒绝整个数据集更改:(谢谢! 【参考方案1】:

您可以使用常规事务,也可以从 TableAdapterManager 中实现类似事务的功能,如下例所示。

第一种使用常规交易的方法,

   public void  savewithTransacition()
    
        DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter();
        DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter();
        SqlTransaction st = null;
        SqlConnection sc = new SqlConnection("ur conneciton string");
        try
        
            sc.Open();
            st = sc.BeginTransaction();

            taTbl1.Transaction = st;
            taTbl2.Transaction = st;
            st.Commit();
        
        catch (System.Exception ex)
        
            st.Rollback();
            throw ex;
        


    

第二个..与表适配器管理器..

  public void SaveWithManager()
    
        DataSet1TableAdapters.TableAdapterManager mgr1 = new DataSet1TableAdapters.TableAdapterManager();
        DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter();
        DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter();

        mgr1.Table1TableAdapter = taTbl1;
        mgr1.Table2TableAdapter = taTbl2;
        mgr1.UpdateOrder = DataSet1TableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete; 
        mgr1.UpdateAll(this);
    

使用此选项,您可以为要保存的表组创建 TAManager。就像您希望一组保存,即使另一组失败。

【讨论】:

我正在挖掘事务管理器信息,但对于我不熟悉的事务来说,这是一个全新的水平。您是否有任何代码示例或资源链接?谢谢! 修改了一些示例代码,您可以选择适合您的任何人。 我玩过这个,但我似乎无法让它做我需要它做的事情。在您的示例中,我似乎得到的是一次调用更新数据集中所有表的能力。这很好,但仍然不会将单个行/相关行更新分解为单个事务。也许我没有很好地解释我需要什么,或者我不明白你向我展示的东西?我开始认为这是不可能的。 你能让它们保持循环吗?和每个循环的事务,以便您可以为每个循环做出决定? 它会很重,但仍然可以达到您的目的。【参考方案2】:

您可以使用具有不同范围选项的事务范围

【讨论】:

问题在于将单个更新与主 .Update() 调用分开,这样有些更新可能会成功,而有些则失败。 您可以使用“抑制”选项,不是吗?这样,带有 Suppress 选项的事务范围内的代码将不会参与您的父事务... 我认为你没有理解我想要做什么

以上是关于类型化数据集中的事务的主要内容,如果未能解决你的问题,请参考以下文章

Spark:数据集中的四舍五入

润乾集算报表的脚本数据集

有没有办法在肺癌数据集中使用多类分类(表明肺癌的异常类型)? [关闭]

在强类型数据集中添加新行?

转载:事务的隔离级别

MySQL简单介绍——换个角度认识MySQL