2012-10-31 38 views
7

目前我正在試圖通過下面的代碼可靠地通過C#下降SQL Server 2008的數據庫

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'的狀態或選項。數據庫處於單用戶模式,並且當前用戶已連接到該用戶。

有關如何通過代碼可靠地刪除數據庫的任何想法?

+0

你嘗試' ALTER DATABASE Db SET MULTI_USER;'第一個? –

+5

就我個人而言,我不會爲此使用SMO,主要是因爲我不確切知道那些'Kill ...()'函數的功能。我寧願說'USE master; ALTER DATABASE Db SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE Db;' –

+0

默認情況下數據庫沒有設置爲SingleUser,我認爲KillDatabase方法失敗的嘗試將它變成單用戶,然後像這樣離開它。 – Konstantinos

回答

3

要通過SMO可靠地刪除數據庫,只需撥打server.KillDatabase("Db");即可。 MSDN並沒有聲明KillDatabase放棄了活動連接,即使它們的示例有點誤導。

KillDatabase問題ALTER DATABASE [Db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE然後DROP DATABASEKillAllProcesses列出所有連接,併爲每個進程發出一個kill作爲單獨的批處理;假設KillAllProcesses是異步的,則在KillDatabase將數據庫設置爲單用戶模式後發生殺死時拋出異常。

1

在我的情況下,我得到的錯誤是通過在KILL方法之前添加server.Databases.Refresh來解決的。其原因是我試圖刪除的數據庫是在Server對象實例化後創建的,換句話說,我暫時創建了一個數據庫,從中提取數據並將其刪除。數據庫沒有顯示在數據庫(對象)列表中。添加刷新伎倆...

0

我通過創建ServerConnection而不修復這種錯誤,而無需組合。就像這樣:

var serverConnection = new ServerConnection(serverName) 
{ 
    ..., 
    NonPooledConnection = true 
}; 
server = new Server(serverConnection); 
server.KillAllProcesses(databaseName); 
1

我有錯誤( 「降失敗...」)使用MSDN :

dbServer.KillAllProcesses(db.Name); 
dbServer.KillDatabase(db.Name); 

周圍的工作是:

string sqlCommandText = @"USE master; 
ALTER DATABASE [" + db.Name + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
DROP DATABASE [" + db.Name + "]"; 
dbServer.ConnectionContext.ExecuteNonQuery(sqlCommandText); 
相關問題