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");. MSDN确实声明会KillDatabase丢弃活动连接,即使他们的示例有点误导。

KillDatabase问题ALTER DATABASE [Db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE然后DROP DATABASEKillAllProcesses列出所有连接并将每个进程发出一个终止作为单独的批处理;假设是异步的,在将数据库设置为单用户模式KillAllProcesses后发生终止时引发异常。KillDatabase

于 2012-11-06T00:50:31.380 回答
1

在我的情况下,我得到的错误是通过在 KILL 方法之前添加 server.Databases.Refresh 来修复的。原因是我试图删除的数据库是在实例化服务器对象之后创建的,换句话说,我是临时创建一个数据库,从中提取数据并删除它。数据库未显示在数据库(对象)列表中。添加刷新就可以了...

于 2013-01-14T20:01:30.097 回答
1

使用 MSDN 时出现错误(“drop failed...”):

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);
于 2017-05-07T18:04:01.203 回答
0

我通过在没有池的情况下创建 ServerConnection 来修复此类错误。像这样:

var serverConnection = new ServerConnection(serverName)
{
     ...,
     NonPooledConnection = true
};
server = new Server(serverConnection);
server.KillAllProcesses(databaseName);
于 2016-08-22T13:05:58.400 回答