В моем наборе данных будет ли метод Update выполняться как транзакция? - PullRequest
1 голос
/ 18 мая 2011

У меня есть набранный набор данных для таблицы с именем 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 Ответ

3 голосов
/ 18 мая 2011

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

Вы можете немного упростить его, хотя:

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