문제

두 개의 다른 폴더 (이미 이전 버전 파일이 포함되어 있음)로 일부 파일을 복사하고 SQL 스크립트를 실행하는 C# 응용 프로그램을 만들고 싶습니다. 전체 과정에서 예외가 발생하면 모든 변경 사항을 롤백해야합니다.

SQL 스크립트의 경우 전환을 사용할 수 있지만 롤백으로 파일 복사 프로세스를 구현하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

교체하기 전에 이전 파일에서 사본을 만들 수 있으며 예외가 발생한 경우이 사본에서 복원 할 수 있습니다.

다른 팁

당신은 이용할 수 있습니다 거래 NTF 가능하다면. 그렇지 않다면, 당신은 당신이 한 작업 목록을 유지하고 롤백이 필요할 때 그 반대를 수행 할 수 있습니다.

또는 소프트웨어 개발자로 진화하고 사용할 수 있습니다. 명령 패턴 배치 명령을 구현하십시오. 명령을 통해 실행 취소 기능을 쉽게 추가하고 지능적인 방식으로 캡슐화 할 수 있습니다. 그런 다음 BatchCommand는 목록 내 각 명령에서 undo ()을 호출 할 수 있습니다.

패턴에 대한 좋은 프라이머는 확인하십시오 첫 번째 디자인 패턴을 헤드하십시오

파일을 임시 디렉토리로 복사 한 다음 전체 디렉토리를 제자리로 이동시키는 것이 유스 케이스에 적합합니까? 그렇다면 롤백은 임시 디렉토리를 삭제하는 것만 큼 간단합니다.

접미사와 임의의 숫자를 추가하는 새 파일을 복사하여 기존 파일 이름과 충돌하지 않습니다.

샘플 ... 오래된 파일 = "myfile.txt", new File = "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 ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top