2009-11-12 15 views
7

Quiero crear una aplicación C# en la que copiar algunos archivos en dos carpetas diferentes (ya contiene archivos de versiones anteriores) y ejecutar scripts sql. Durante todo el proceso, si se produce alguna excepción, necesito deshacer todos los cambios.¿Cómo implementar la función de reversión?

Para las secuencias de comandos sql, se puede utilizar la transacción, pero ¿cómo implementar los archivos proceso de copia con retrotracción?

+0

Dependiendo del sistema a apuntar, los cambios del sistema de archivos también se pueden poner en una transacción. Comenzando con Windows Vista NTFS tiene esta capacidad. – Joey

Respuesta

2

Puede hacer una copia desde el archivo anterior antes de reemplazarlo, y luego, si se produce una excepción, restaurar desde esta copia.

0

¿Encajaría en su caso de uso para copiar los archivos en un directorio temporal y luego mover todo el directorio en su lugar? Si es así, la reversión es tan simple como eliminar el directorio temporal.

+1

¿Y qué hace si falla la operación de mover de ese directorio? Eso no es una operación atómica así que * puede * fallar. – Joey

+0

El movimiento es en realidad un cambio de nombre en la mayoría de los sistemas operativos. Sucede en una sola operación. El sistema operativo bloquea el archivo que representa el directorio durante el cambio, por lo que actúa como si fuera atómico. Vea las garantías ofrecidas en esta página del hombre antiguo para el comando 'mv' de Linux: http://www.linuxmanpages.com/man2/rename.2.php –

3

Puede aprovechar el Transactional NTFS si es posible. De lo contrario, puede mantener una lista de las operaciones que realizó y hacer lo contrario cuando se necesita una reversión.

3

O puede evolucionar como desarrollador de software y usar el Command Pattern e implementar un BatchCommand. Los comandos hacen que sea muy fácil agregar la funcionalidad deshacer y encapsularla de una manera inteligente. Un BatchCommand puede llamar a undo() en cada comando dentro de su lista.

Para un buen manual de patrones, echa un vistazo a Head First Design Patterns

0

que sería copiar los nuevos archivos añadiendo un sufijo y un número al azar, evitando así entrar en conflicto con los nombres de archivos preexistentes.

Ejemplo ... Archivo anterior = "myfile.txt", Nuevo archivo = "myfile.txt.new.285387".

Luego, cuando el proceso de copiado finaliza bien, yo ... -Renombre el archivo anterior como "miarchivo.txt.old.3464353". -Renombrar el nuevo archivo como "miarchivo.txt" -Por último, se borrará el antiguo.

0

probar este código

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