문제
두 개의 다른 폴더 (이미 이전 버전 파일이 포함되어 있음)로 일부 파일을 복사하고 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;
}