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

Rus*_*ard 4 .net c# sql-server smo database-restore

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

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);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行此方法时,我尝试杀死所有进程时收到以下(错误)消息:

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

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

usr*_*usr 6

根本不打电话KillAllProcesses.RollbackTransactionsImmediately足够.它会立即杀死该数据库中的所有会话.

KillAllProcesses 无论如何都不会帮助你,因为在完成杀戮会话之后会出现一个新的会话.


M.A*_*Ali 3

当我尝试恢复数据库并且某处存在活动连接并且数据库不会恢复,直到不再有与数据库的活动连接时,这种情况总是发生在我身上。

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

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
Run Code Online (Sandbox Code Playgroud)