Восстановление базы данных SQL Server 2005 с помощью C #. Проблема с откатом

Привет, я только начинаю изучать C #. Я пытаюсь восстановить файл .bak. Однако я получаю сообщение об ошибке. Эксклюзивный доступ не может быть получен, потому что база данных уже используется.

Я провел свое исследование здесь и здесь оба говорят, что я должен выполнить откат. Я не знаю, как применить откат в моем коде восстановления.

    public void RestoreDatabase(String RestorePath)
    {
        try
        {
            SqlConnection sqlCon = new SqlConnection("Data Source=RITZEL-PC\\SQLEXPRESS;User ID=NNIT-Admin;Password=password;Initial Catalog=master;");
            ServerConnection connection = new ServerConnection(sqlCon);
            Server sqlServer = new Server(connection);

            Restore restoreDB = new Restore();

            restoreDB.Database = "NNIT DB";
            restoreDB.Action = RestoreActionType.Database;
            restoreDB.Devices.AddDevice(RestorePath, DeviceType.File);

            restoreDB.ReplaceDatabase = true; // will overwrite any existing DB     
            restoreDB.NoRecovery = false; // NoRecovery = true;

            restoreDB.SqlRestore(sqlServer);

            MessageBox.Show("Restored");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + " " + ex.InnerException);
        }
    }

person Ritzel    schedule 16.02.2012    source источник


Ответы (2)


Используя SMO, вы можете настроить доступ и откат пользователей следующим образом:

Server sqlServer = new Server(connection);

Database db = sqlServer.Databases["DbToRestore"];

if (db != null)
{
    sqlServer.KillAllProcesses(db.Name);
    db.DatabaseOptions.UserAccess = DatabaseUserAccess.Multiple;
    db.Alter(TerminationClause.RollbackTransactionsImmediately);
}

Restore restoreDB = new Restore();
person Anders Lien    schedule 16.02.2012

Это работает?

SqlCommand cmd = new SqlCommand("ALTER DATABASE yourdatabasename SET MULTI_USER WITH ROLLBACK IMMEDIATE", sqlConn);
cmd.ExecuteNonQuery();
person Andy Skirrow    schedule 16.02.2012
comment
Куда я это положу? Перед восстановлением restoreDB = new Restore () ;? - person Ritzel; 16.02.2012
comment
Да, он должен убить все подключения к базе данных - person Andy Skirrow; 16.02.2012
comment
Неправильный синтаксис рядом с ключевыми словами "SET" и "with". Если этот оператор является общим табличным выражением или предложением xmlnamespaces, предыдущий оператор должен заканчиваться точкой с запятой. Неправильный синтаксис рядом с "НЕМЕДЛЕННО". - person Ritzel; 16.02.2012
comment
Убедитесь, что вы цитируете имя своей многопользовательской базы данных, например [NNIT DB] в квадратных скобках - person Andy Skirrow; 16.02.2012