7

現在、次のコードを使用してデータベースを削除しようとしています

using Microsoft.SqlServer.Management.Smo;

var server = new Server(Server);
server.KillAllProcesses("Db");
server.KillDatabase("Db");

うまくいく場合もありますが、次の例外が発生する場合もあります。

Microsoft.SqlServer.Management.Smo.FailedOperationException: サーバー 'Host1' のデータベースの強制終了に失敗しました。
---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。
---> System.Data.SqlClient.SqlException: 現時点では、データベース 'Db' の状態またはオプションを変更できません。データベースはシングル ユーザー モードで、ユーザーが現在データベースに接続しています。

コードを介してデータベースを確実に削除する方法についてのアイデアはありますか?

4

4 に答える 4

4

SMO を介してデータベースを確実に削除するには、 を呼び出すだけで十分server.KillDatabase("Db");です。MSDNKillDatabaseは、例が少し誤解を招くものであっても、アクティブな接続をドロップすると述べています。

KillDatabase問題ALTER DATABASE [Db] SET SINGLE_USER WITH ROLLBACK IMMEDIATEとそれからDROP DATABASEKillAllProcessesすべての接続をリストし、プロセスごとに 1 つの kill を別のバッチとして発行します。非同期であると仮定すると、DBをシングルユーザーモードに設定したKillAllProcesses後に強制終了が発生すると、例外がスローされます。KillDatabase

于 2012-11-06T00:50:31.380 に答える
1

私の場合、KILL メソッドの前に server.Databases.Refresh を追加することで、エラーが修正されました。その理由は、サーバー オブジェクトがインスタンス化された後に削除しようとしていたデータベースが作成されたためです。つまり、一時的にデータベースを作成し、そこからデータを抽出して削除していました。データベースがデータベース (オブジェクト) のリストに表示されませんでした。リフレッシュを追加するとうまくいきました...

于 2013-01-14T20:01:30.097 に答える