Будет ли в моем типизированном наборе данных метод Update работать как транзакция?

У меня есть типизированный набор данных для таблицы под названием «Люди». Когда вы вызываете метод обновления адаптера таблицы и передаете таблицу, выполняется ли он как транзакция?

Я обеспокоен тем, что в какой-то момент ограничения, установленные в 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)
{ /* ... */ }

person Mohgeroth    schedule 18.05.2011    source источник


Ответы (1)


Ваш подход должен работать.

Хотя можно немного упростить:

using (TransactionScope ts = new TransactionScope())
{
     // your old code here
     ts.Complete();
}
person Alex Aza    schedule 18.05.2011
comment
Только что понял, почему не работает дополнение 4.0. Забыл упомянуть, что я был на 3.5 SP1. Хорошая вещь, хотя, просто жаль, что я не мог использовать это. - person Mohgeroth; 18.05.2011
comment
@Mohgeroth - это не ново. Он существует с версии 2.0 — msdn.microsoft.com/en-us/library/ - person Alex Aza; 18.05.2011
comment
Теперь я вижу это, мне пришлось добавить ссылку вручную. Первый поиск сказал 4.0, поэтому я предположил, что это плохо. Замечательная маленькая штука, упрощающая весь этот дополнительный код! - person Mohgeroth; 18.05.2011