繁体   English   中英

如何实现回滚功能?

[英]How implement Rollback feature?

我想创建一个C#应用程序,其中复制两个不同文件夹中的一些文件(已包含旧版本文件)并运行sql脚本。 在整个过程中,如果生成任何异常,我需要回滚所有更改。

对于sql脚本,可以使用转换但是如何通过回滚实现文件复制过程?

如果可能,您可以利用Transactional NTFS 如果没有,那么您可以保留所做操作的列表,并在需要回滚时执行相反的操作。

或者您可以作为软件开发人员发展并使用命令模式并实现BatchCommand。 通过命令,可以非常轻松地添加撤消功能并以智能方式对其进行封装。 然后,BatchCommand可以在其列表中的每个Command上调用undo()。

有关模式的良好入门,请查看Head First Design Patterns

您可以在替换之前从旧文件中复制,然后如果发生异常,则从此副本还原。

它是否适合您的用例将文件复制到临时目录,然后将整个目录移动到位? 如果是这样,回滚就像删除临时目录一样简单。

我会复制附加后缀和随机数的新文件,从而避免与预先存在的文件名冲突。

示例...旧文件=“myfile.txt”,新文件=“myfile.txt.new.285387”。

然后,当复制过程完成时,我会... - 将旧文件重命名为“myfile.txt.old.3464353”。 - 将新文件重命名为“myfile.txt” - 最后旧文件将被删除。

试试这个代码

  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;
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM