Для управления изменениями в нашей базе данных я пишу простую программу на C #, которая перебирает XML-файл и применяет различные операторы.
Пример XML:
<root>
<update>
<statement>{{query}}</statement>
<statement>{{query}}</statement>
</update>
<update>
<statement>{{query}}</statement>
</update>
</root>
Я пытаюсь дать пользователю возможность:
- Пропустить инструкцию
- Пропустить обновление
- Откат полностью
- Фиксация и остановка
Проблема, с которой я сталкиваюсь, заключается в том, что при сбое 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;
}
}
}
}