如何使用C#和SMO终止与SQL Server数据库的所有连接?

时间:2015-04-06 12:55:28

标签: c# .net sql-server smo database-restore

我尝试使用C#和SMO从.BAK文件恢复数据库。这是我的代码。

public static void RestoreDatabase()
{
    string dbConnString = Configuration.DatabaseConnectionString;
    ServerConnection connection = new ServerConnection(@"dbserver\sqlexpress", "user", "password");
    Server smoServer = new Server(connection);

    Restore rstDatabase = new Restore();
    rstDatabase.Action = RestoreActionType.Database;
    rstDatabase.Database = "AppDb";

    BackupDeviceItem bkpDevice = new BackupDeviceItem(@"TestData\db-backup.bak", DeviceType.File);
    rstDatabase.Devices.Add(bkpDevice);
    rstDatabase.ReplaceDatabase = true;

    // Kill all processes
    smoServer.KillAllProcesses(rstDatabase.Database);

    // Set single-user mode
    Database db = smoServer.Databases[rstDatabase.Database];
    db.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
    db.Alter(TerminationClause.RollbackTransactionsImmediately);

    rstDatabase.SqlRestore(smoServer);
}

然而,当我尝试运行此方法时,我在尝试终止所有进程时收到以下(错误)消息:

  

无法使用KILL杀死自己的进程。

如果有人能帮忙解决这个问题,我将非常感激。

2 个答案:

答案 0 :(得分:6)

不要致电KillAllProcessesRollbackTransactionsImmediately就够了。它会立即杀死该数据库中的所有会话。

无论如何,

KillAllProcesses对你没有帮助,因为在完成杀戮会话后,可能会出现一个新会话。

答案 1 :(得分:2)

当我尝试恢复数据库并且某处存在活动连接时,它始终发生在我身上,并且在没有更多活动连接到数据库之前,数据库将无法恢复。

通常我所做的是,我执行以下命令集来断开所有人的连接,然后恢复数据库。

ALTER DATABASE [DatabaseName]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

-- at this point all the users will be disconnected and the database is in 
-- single-user mode

Use [DatabaseName]  --<-- Grab that single connection 
GO

Use [master]        --<-- Disconnect from database and connect to Master DB for restore
GO

RESTORE DATABASE [DatabaseName]  --<-- Finally restore database tara
 FROM DISK .........  
GO