Как реализовать функцию отката? - PullRequest
7 голосов
/ 12 ноября 2009

Я хочу создать приложение на C #, в котором скопировать некоторые файлы в две разные папки (уже содержит файлы более старых версий), а также запустить сценарии sql. В течение всего процесса, если генерируется какое-либо исключение, мне нужно откатить все изменения.

Для сценариев sql можно использовать переход, но как реализовать процесс копирования файлов с откатом?

Ответы [ 6 ]

3 голосов
/ 12 ноября 2009

Или вы можете развиваться как разработчик программного обеспечения и использовать Командный шаблон и реализовать BatchCommand. Команды позволяют очень легко добавлять функции отмены и инкапсулировать их интеллектуальным способом. Затем BatchCommand может вызвать undo () для каждой команды в своем списке.

Для хорошего понимания шаблонов, посмотрите Head First Design Patterns

3 голосов
/ 12 ноября 2009

Вы можете воспользоваться Транзакционной NTFS , если это возможно. Если нет, то вы можете сохранить список операций, которые вы сделали, и сделать наоборот, когда потребуется откат.

2 голосов
/ 12 ноября 2009

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

0 голосов
/ 01 июля 2014

Попробуйте этот код

  public bool updateusertable(string UserName,string Password,string Datetime)
            {
                bool bResult = false;            
            SqlTransaction tx; 
                try
                {
                    tx=conn.Begintransaction();
                    SqlCommand Ocmd = new SqlCommand();
                    Sqlconnect = Cconnect.OpenSqlConnection();
                    Ocmd.Connection = Sqlconnect;
                    Ocmd.CommandType = CommandType.StoredProcedure;
                    Ocmd.CommandText = "SP_User_login_Update";
                    Ocmd.Parameters.Add("@UserName", SqlDbType.VarChar, 100).Value = UserName;
                    Ocmd.Parameters.Add("@Password", SqlDbType.VarChar, 100).Value = Password;
                    Ocmd.Parameters.Add("@lastlogin", SqlDbType.VarChar, 100).Value = Datetime;
                    int i = Ocmd.ExecuteNonQuery();
                    if (i <= 1)
                    {
                        bResult = true;
                        tx.Commit();
                    }else
                    {
                        tx.Rollback();
                    }
                }
                catch (Exception ex)
                {
                    string msg = ex.Message.ToString();
                    tx.Rollback();
                }
                finally
                {

                }
                return bResult;
            }
0 голосов
/ 12 ноября 2009

Я бы скопировал новые файлы с добавлением суффикса и случайного числа, чтобы избежать конфликта с существующими именами файлов.

Пример ... Старый файл = "myfile.txt", новый файл = "myfile.txt.new.285387".

Тогда, когда процесс копирования закончится, я бы ... -Переименуйте старый файл как «myfile.txt.old.3464353». -Переименуйте новый файл как «myfile.txt» -Наконец старая будет стерта.

0 голосов
/ 12 ноября 2009

Подойдет ли вам вариант использования, чтобы скопировать файлы во временный каталог и затем переместить весь каталог на место? Если это так, откат выполняется так же просто, как удаление временного каталога.

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