我有一个名为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)
{ /* ... */ }
答案 0 :(得分:3)
你的方法应该有效。
你可以稍微简化一下:
using (TransactionScope ts = new TransactionScope())
{
// your old code here
ts.Complete();
}