我想创建一个 C# 应用程序,在其中复制两个不同文件夹中的一些文件(已经包含旧版本文件)并运行 sql 脚本。在整个过程中,如果产生任何异常,我需要回滚所有更改。
对于 sql 脚本,可以使用事务,但是如何实现文件复制过程和回滚?
如果可能,您可以利用事务性 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;
}