SqlTransaction пропускает запрос вместо отката - PullRequest
0 голосов
/ 25 сентября 2018

Для управления изменениями в нашей базе данных я пишу простую программу на C #, которая перебирает XML-файл и применяет различные операторы.

Пример XML:

<root>
<update>
    <statement>{{query}}</statement>
    <statement>{{query}}</statement>
</update>
<update>
    <statement>{{query}}</statement>
</update>
</root>

Я пытаюсь дать пользователю возможность:

  1. Пропустить инструкцию
  2. Пропустить обновление
  3. Откат полностью
  4. Фиксация и остановка

Проблема, с которой я сталкиваюсь, заключается в том, что при сбое 1 запроса происходит откат всей транзакции.Я хочу справиться с этим сам.Возможно ли это?

Мой код

transaction.Save(String.Format("{0}", executedUpdates));
Actions? action = null;

foreach (XmlNode statement in update.ChildNodes)
{
    if (action != null && action.HasValue && action.Value == Actions.Skip_Update) break;

    using (SqlCommand cmd = new SqlCommand(statement.InnerText, connection, transaction))
    {
        try
        {
            cmd.ExecuteNonQuery();
        } catch (Exception e)
        {
            // Transaction already rollbacked

            // Get input what to do with error
            action = await Executor.HandleError();
            // Handle 
            switch (action)
            {
                case Actions.Skip_Statement:
                    // Carry on with next statement
                    break;
                case Actions.Skip_Update:
                    // Rollback to before this batch
                    transaction.Rollback(String.Format("{0}", executedUpdates));
                    break;
                case Actions.Commit_And_Stop:
                    // Commit and stop
                    transaction.Commit();
                    return true;
                case Actions.Rollback:
                    // Rollback and stop
                    transaction.Rollback();
                    return true;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...