Резервное копирование / восстановление SQL Server с индикатором хода выполнения - PullRequest
0 голосов
/ 08 июня 2019

У меня есть программа резервного копирования и восстановления для приложения Windows Form, которая отлично работает для меня. Мне нужно поместить этот код в поток или фоновый рабочий, чтобы показать ход выполнения операции в процентах завершено. Ниже мой код. Любая помощь будет оценена.

if (rdBackup.Checked)
{
    SaveFileDialog svdlg = new SaveFileDialog();
    svdlg.Filter = "Sql Server Database Backup File *.bak|*.bak";

    svdlg.ShowDialog();

    if (!string.IsNullOrEmpty(svdlg.FileName))
    {
        SqlConnection cn = new SqlConnection(Variables.ConStr);
        cn.Open();

        SqlCommand cmd = new SqlCommand();
        SqlDataReader reader;
        cmd.CommandText = @"BACKUP DATABASE [" + cn.Database.ToString() + "] TO DISK = '" + svdlg.FileName + "'";

        cmd.CommandType = CommandType.Text;
        cmd.Connection = cn;

        reader = cmd.ExecuteReader();
        cn.Close();

        MessageBox.Show("Database backup successful.");
    }
}
else
{
    btnBackupRestore.Text = "&Restore Database";

    OpenFileDialog opdlg = new OpenFileDialog();
    opdlg.Filter = "SQL Server Database Backup File *.bak|*.bak";

    opdlg.ShowDialog();

    if (!string.IsNullOrEmpty(opdlg.FileName))
    {
        SqlConnection cn = new SqlConnection(Variables.ConStr);
        cn.Open();

        SqlCommand cmd = new SqlCommand();
        SqlDataReader reader;
        cmd.CommandText = @"use master;ALTER DATABASE [" + cn.Database.ToString() + "] SET Single_User WITH Rollback Immediate;  " +
                 "RESTORE DATABASE [" + cn.Database.ToString() + "] FROM DISK = '" + opdlg.FileName + "'"
                 + "ALTER DATABASE [" + cn.Database.ToString() + "] SET Multi_User ";

        //cmd.CommandText = "DBCC CHECKDB ('[" + cn.Database.ToString() + "]')";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = cn;

        reader = cmd.ExecuteReader();

        cn.Close();

        MessageBox.Show("Database restored successfully.");
    }
}

1 Ответ

0 голосов
/ 08 июня 2019

Если вы хотите перехватить 10,20,30,40 ... сообщений, отправленных во время резервного копирования в окно SSMS, и подготовить какой-нибудь индикатор выполнения, чтобы показать эти улучшения, то вам нужно использовать библиотеки SMO (Sql Server Management Objects)

Код для получения этих сообщений и выполнения резервного копирования следующий

using(SqlConnection con = new SqlConnection(".......")) 
{
    ServerConnection svrConnection = new ServerConnection(con);
    Server server = new Server(svrConnection);
    Backup bk = new Backup();
    bk.PercentComplete += pctComplete;
    bk.Action = BackupActionType.Database;
    bk.Database = con.Database
    bk.Devices.Add(new BackupDeviceItem(svdlg.FileName, DeviceType.File));
    bk.SqlBackup(server);

}

void pctComplete(object server, PercentCompleteEventArgs e)
{
    Console.WriteLine(e.Percent);
}

Операция восстановления аналогична

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...