キャンセルボタンをユーザに提供して、進行中のリストアを中止します。これを行うには、Restore.PercentComplete
イベントハンドラで、ユーザが[キャンセル]ボタンをクリックしてRestore.Abort()
を呼び出したかどうかを確認します。しかし、これは助けない:リストアDBを中止できません
をSMOは例外をスロー:
復元は、サーバのMICHAEL7 "に失敗しました。
Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。
スタックトレース:Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(サーバーsrv)
DBは「復元」モードで永久に維持されます。ここに関連するコードは次のとおりです。
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
private volatile bool _CancelRestore = false;
private Restore _RestoreDB;
private Server _myServer;
private Database _currentDatabase;
// user hits Cancel buttton
public void CancelRestore()
{
_CancelRestore = true;
}
// Restore.PercentComplete event handler
private static void CompletionStatusInPercent(object sender, PercentCompleteEventArgs args)
{
if (_CancelRestore)
{
_RestoreDB.Abort();
// Disable the kills to let some time to Abort()
// Stop all processes running on the _currentDatabase database
// _myServer.KillAllProcesses(_currentDatabase.Name);
// Stop the _currentDatabase database
// NOTE: it is a temp name DB: I do not restore over my application DB!
// _myServer.KillDatabase(_currentDatabase.Name);
}
else
{
Console.Clear();
Console.WriteLine("Percent completed: {0}%.", args.Percent);
}
}
バックアップ/機能は、この記事の助けを借りて実施された復元:SQL Server 2005 Database Backup and Restore using C# and .NET 2.0
感謝を。
ブレークポイントを入れて、 'CompletionStatusInPercent'が(それがあるべき)多くの場合、ヒットした場合、また_CancelRestore'この'に 'volatile'キーワードを追加してくださいは、任意のCPUを無効にする必要がありますboolのキャッシュとboolの実際の値を確認するスレッドを強制します(これは保証されていませんが)。 – oleksii
hi @oleksii。揮発性のためにありがとう。ブレークポイントはそこにあり、きちんと訪問されます。私が推測する問題はSMOのどこかにあります。バックアップ/復元の作業例が必要です。 –
キルのものをコメントアウトする!あなたはそれを一緒に戻す時間を与えていません! –