Как сделать backup/restore базы MSSQL программно

336
15 февраля 2017, 20:44

Как можно сделать backup/restore базы данных MSSQL программно на C#? Пользователь выбирает место сохранения (например, флешку) и база сохраняется.

Так

public void BackupDB()
{
    Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
    dlg.FileName = String.Format("DataBase_{0}", DateTime.Now.ToString("yyyy-MM-dd"));
    dlg.DefaultExt = ".bak";
    dlg.Filter = "Базы данных (*.bak)|*.bak|Все файлы (*.*)|*.*";
    if (dlg.ShowDialog() == true)
    {
        string filename = dlg.FileName;
        using (var conn = new System.Data.SqlClient.SqlConnection(_сonnectionString))
        {
            var query = String.Format("BACKUP DATABASE MYDB TO DISK='{0}'", filename);
            using (var cmd = new System.Data.SqlClient.SqlCommand(query, conn))
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }
}

не получается.

Пробовал вместо полного пути подставлять только имя файла. Тогда бэкап создается в папке по умолчанию, наподобие C:\SQLDB\MSSQL12.SQLEXPRESS\MSSQL\Backup\ (в данном случае сервер - локальный).

Но как программно наиболее простым способом можно узнать этот путь (имея в наличии строку подключения)? И можно ли из этой папки перемещать файлы на ту же флешку?

Answer 1

В общем случае задача не решается, потому что администратор сервера баз данных определяет - имеете вы доступ к бэкапам или не имеете. Он может закрыть учетной записи SQL Server'а доступ к каким либо компьютерам, кроме самого сервера, и закрыть вам доступ ко всем папкам на этом сервере, для примера.

В частных случаях есть два варианта:

  • Вам необходимо обеспечить доступ учетке SQL Server'а к вашей флешке, либо подключив ее локально к серверу, либо использовав имеющую доступ к сети учетку SQL Server'а и дав этой учетке доступ к своему устройству через сеть, обращаясь при этом, понятно, по сетевому имени, например \\COMPUTER\E$\MyBackupDirectory.
  • Делать бэкап в локальную директорию на сервере баз данных в папку, доступную вашему приложению по сети (такую папку вы предварительно должны создать и настроить) и после выполнения бэкапа копировать его на флешку.

Если же отвечать на вопрос, как узнать этот путь (хотя, на самом деле, вам это не нужно), то получить его можно следующим запросом (при наличии нужных прав, понятно):

EXEC  master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory'
READ ALSO
как сделать ссылку с двумя параметрами?

как сделать ссылку с двумя параметрами?

Вопрос такой как сделать что бы в одной ссылке передавалось 2 get параметра

328
ограничить дерево комментариев

ограничить дерево комментариев

Есть функция которая отлично собирает дерево

292
WordPress: Как убрать sidebar для Страницы записей?

WordPress: Как убрать sidebar для Страницы записей?

Здравствуйте, Вопрос заключается в следующем: Каким образом (без использования плагинов) я могу убрать sidebar со Страницы Записей?

560
php json парсинг внутри (callback)

php json парсинг внутри (callback)

Здравствуйте! Подскажите пожалуйста, как мне спарсить значения json файла, который обернут в callback ?

450