c# - 设置单用户模式恢复备份

标签 c# sql-server backup single-user

我有以下功能:

public void RestoreDatabase(String databaseName, String backUpFile, 
                            String serverName, String userName, String password)
{
    SqlConnection.ClearAllPools();
    ServerConnection connection = new ServerConnection
                                          (serverName, userName, password);
    Server sqlServer = new Server(connection);
    Restore rstDatabase = new Restore();
    rstDatabase.Action = RestoreActionType.Database;
    rstDatabase.Database = databaseName;
    BackupDeviceItem bkpDevice = new BackupDeviceItem
                                         (backUpFile, DeviceType.File);
    rstDatabase.Devices.Add(bkpDevice);
    rstDatabase.ReplaceDatabase = true;
    rstDatabase.SqlRestore(sqlServer);
}

在恢复备份之前,我试图先将数据库设置为单用户模式。我试过这段代码:

        private string singleUserCmd = "alter database db-name set SINGLE_USER";
        private string multiUserCmd = "alter database db-name  set MULTI_USER";

        private void SetSingleUser(bool singleUser, 
                                   SqlConnectionStringBuilder csb)
        {
            string v;
            if (singleUser)
            {
                v = singleUserCmd.Replace("db-name", csb.InitialCatalog);
            }
            else
            {
                v = multiUserCmd.Replace("db-name", csb.InitialCatalog);
            }
            SqlCommand cmd = new SqlCommand(v, new SqlConnection
                                                     (csb.ToString()));
            try
            {
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
            }
            finally
            {
                cmd.Connection.Close();
            }
        }

问题似乎是单用户模式用于该连接,阻止其他任何人做任何事情。我需要它用于恢复备份的连接。

最佳答案

恢复需要在将数据库置于单用户模式的连接上进行,所以为什么不让您的 SetSingleUser 函数返回它执行时打开的 SqlConnection,然后让您的恢复代码接受并使用相同的打开连接。

private string singleUserCmd = "alter database db-name set SINGLE_USER";
private string multiUserCmd = "alter database db-name  set MULTI_USER";

private SqlConnection SetSingleUser(bool singleUser, SqlConnectionStringBuilder csb)
{
    string v;
    if (singleUser)
    {
        v = singleUserCmd.Replace("db-name", csb.InitialCatalog);
    }
    else
    {
        v = multiUserCmd.Replace("db-name", csb.InitialCatalog);
    }
    SqlConnection connection = new SqlConnection(csb.ToString());
    SqlCommand cmd = new SqlCommand(v, connection);

        cmd.Connection.Open();
        cmd.ExecuteNonQuery();

    return connection;
}

关于c# - 设置单用户模式恢复备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1674179/

相关文章:

c# - 使用 OpenXML SDK 将 docx 文件中的文本替换为换行符(换行符)

sql - 同一列上的聚集索引和非聚集索引有什么用

SQL - 根据日期范围高效选择数据

c# - 来自 C# 远程服务器的 MysqlBackup

c# - 使用 FieldInfo.SetValue 与 LINQ 表达式在结构中设置字段

c# - 过时的属性不会在 VS2010 中引起任何编译器警告

sql - T-SQL/SSIS - 使用主/外键重新设计后表锁定

python - 既然服务已关闭,我该如何制作脚本来恢复我的 Grooveshark 播放列表?

linux - 对整个服务器进行备份以便以后恢复

c# - JSON.Net无法在自定义JsonConverter中反序列化json数组