質問
私は(すでに古いバージョンのファイルが含まれています)2切り抜いたフォルダ内のいくつかのファイルをコピーするC#アプリケーションを作成したいともSQLスクリプトを実行します。いずれかの例外が発生した場合、全体のプロセスの間、私はすべての変更をロールバックする必要があります。
SQLスクリプトの場合、トランザクションの独立を使用することができるが、どのようにファイルをロールバックして、プロセスをコピー実装する?
解決
あなたはそれを交換する前に、古いファイルからコピーを作成し、その例外が発生した場合、このコピーから復元することができます。
他のヒント
あなたはトランザクションNTFSのに可能ならば利用することができます。そうでない場合は、あなたがやったオペレーションのリストを維持することができますし、ロールバックが必要になったとき、それの逆を行います。
それとも、ソフトウェア開発者として進化し、 Commandパターンを使用してBatchCommandを実装することができます。コマンドは、アンドゥ機能を追加し、インテリジェントな方法でそれをカプセル化することが非常に簡単になります。 BatchCommandはそのリスト内の各コマンドのアンドゥ()を呼び出すことができます。
のパターンに優れたプライマーについては、<のhref = "http://books.google.com/books?id=LjJcCnNf92kC&lpg=PP1&dq=head%20first%20design%20patterns&pg=PA206#v=onepage&q=&fをチェックしてください
に=偽」のrel = "nofollowをnoreferrer">ヘッドファーストデザインパターン>これは、一時ディレクトリにファイルをコピーするために、あなたのユースケースに合わせた後、所定の場所にディレクトリ全体を移動しますか?その場合、ロールバックは一時ディレクトリを削除するのと同じくらい簡単です。
私は、このように既存のファイル名と衝突することを回避、接尾辞と乱数追加新しいファイルをコピーします。
サンプル... 古いファイル= "myfile.txtの" = "myfile.txt.new.285387" 新しいファイルます。
コピー処理が完了したらOKされたときにそこで、私は希望... 「myfile.txt.old.3464353」として古いファイルを-rename。 「myfile.txtの」として、新しいファイルを-rename - 最後古いが消去されます。
このコードを試してみてください
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;
}