Транзакции в типизированных наборах данных - PullRequest
5 голосов
/ 20 декабря 2010

Имейте типизированный набор данных с несколькими связанными таблицами и отношениями, определенными между этими таблицами. При обработке потока данных я добавляю, изменяю и удаляю записи, а затем вызываю update для каждой таблицы.

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

Причина использования типизированного набора данных заключается в том, что я должен проверить существующие данные, чтобы определить, добавляю ли я, изменяю или удаляю записи ... поэтому мне нужен полный дамп всего, с чем я работаю (альтернатива было бы 10000 запросов к базе данных, когда я обрабатываю записи одну за другой).

Мне нужна поддержка транзакций, но я не вижу способа сделать это с типизированными наборами данных. Например, я создаю новый запрос, когда создаю новое повторное утверждение. Но если повторное утверждение не обновляется, я не хочу сохранять запрос.

Помещение вызовов обновления под TransactionScope будет означать, что если какая-либо запись не удастся, все они потерпят неудачу. Не то, что я хочу.

Как мне зафиксировать или откатить связанные строки в наборе типизированных данных?

Ответы [ 2 ]

3 голосов
/ 20 декабря 2010

Вы можете использовать обычные транзакции, а также реализовать функцию, подобную транзакции, из 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 для группы таблиц для сохранения. например, если вы хотите сохранить одну группу и даже если другая потерпит неудачу.

0 голосов
/ 21 декабря 2010

Вы можете использовать область транзакции с различными параметрами области

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...