在我的类型化数据集中,Update方法是否会作为事务运行?

时间:2011-05-18 02:52:13

标签: c# .net-3.5 transactions strongly-typed-dataset

我有一个名为People的表的类型化数据集。当您调用表适配器的更新方法并传入表时,它是作为事务运行吗?

我担心在某些时候xsd中设置的约束会通过,但数据库会因某种原因拒绝此项。我想确保整个更新被拒绝,我不确定它是否只接受它可以发生的错误。

如果它作为交易运行我有这个

Auth_TestDataSetTableAdapters.PeopleTableAdapter tableAdapter = new Auth_TestDataSetTableAdapters.PeopleTableAdapter();
Auth_TestDataSet.PeopleDataTable table = tableAdapter.GetDataByID(1);

table.AddPeopleRow("Test Item", 5.015);
tableAdapter.Update(table);

但如果我必须在交易中手动捕获这个,我最终会用这个

Auth_TestDataSetTableAdapters.PeopleTableAdapter tableAdapter = new Auth_TestDataSetTableAdapters.PeopleTableAdapter();
Auth_TestDataSet.PeopleDataTable table = tableAdapter.GetDataByID(1);

tableAdapter.Connection.Open();
tableAdapter.Transaction = tableAdapter.Connection.BeginTransaction();

table.AddPeopleRow("Test Item", 5.015);

try
{
    tableAdapter.Update(table);
    tableAdapter.Transaction.Commit();
}
catch
{
    tableAdapter.Transaction.Rollback();
}
finally
{
    tableAdapter.Connection.Close();
}

无论哪种方式都有效,但我对内部运作感兴趣。我决定处理这种类型的行添加的方式有任何其他问题吗?

- 编辑 -

确定它不能作为事务工作,并且会在错误发生之前提交许多记录。感谢以下有用的帖子,一些交易代码已被浓缩,以便更容易控制交易:

Auth_TestDataSetTableAdapters.PeopleTableAdapter tableAdapter = new Auth_TestDataSetTableAdapters.PeopleTableAdapter();
Auth_TestDataSet.PeopleDataTable table = tableAdapter.GetDataByID(1);

try
{
    using (TransactionScope ts = new TransactionScope())
    {
        table.AddPeopleRow("Test Item", (decimal)5.015);
        table.AddPeopleRow("Test Item", (decimal)50.015);
        tableAdapter.Update(table);

        ts.Complete();
    }
}
catch (SqlException ex)
{ /* ... */ }

1 个答案:

答案 0 :(得分:3)

你的方法应该有效。

你可以稍微简化一下:

using (TransactionScope ts = new TransactionScope())
{
     // your old code here
     ts.Complete();
}