Domanda

Voglio creare un'applicazione C # in cui copiare alcuni file in due cartelle diffrent (già contiene file di versione più vecchi) e anche eseguire script SQL. Durante tutto il processo, se alcuna eccezione generare ho bisogno di far ritirare tutte le modifiche.

Per gli script SQL, transation può essere usato ma come implementare i file di processo di copia con rollback?

È stato utile?

Soluzione

È possibile effettuare una copia dal vecchio file prima di sostituirla, e poi se un'eccezione è accaduto ripristino da questa copia.

Altri suggerimenti

È possibile usufruire di NTFS transazionale se possibile. Se no, allora si può tenere un elenco delle operazioni che hai fatto e fare il contrario di esso quando è necessario un rollback.

In alternativa si può evolvere come sviluppatore di software e utilizzare il Comando modello e attuare una BatchCommand . I comandi rendono molto facile aggiungere funzionalità di undo e incapsulare in modo intelligente. Un BatchCommand può quindi chiamare undo () su ogni comando all'interno della sua lista.

Per una buona introduzione ai modelli, controlla noreferrer Head First design Patterns

sarebbe adatta al vostro caso d'uso per copiare i file in una directory temporanea e quindi spostare l'intera directory in posizione? Se è così, rollback è così semplice come la cancellazione della directory temporanea.

Vorrei copiare i nuovi file aggiungendo un suffisso e un numero casuale, evitando così a scontrarsi con i nomi dei file preesistenti.

Esempio ... Vecchio file = "myfile.txt", Nuovo file = "myfile.txt.new.285387".

Poi, quando il processo di copia è terminato ok, vorrei ... -Rename il vecchio file come "myfile.txt.old.3464353". -Rename il nuovo file come "myfile.txt" -Infine il vecchio sarà cancellato.

provare questo codice

  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;
            }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top