Muhammad Rehbar Sheikh Ответов: 2

Невозможно создать резервную копию базы данных SQL server (сетевой режим) с помощью C# ошибка: аварийное завершение резервного копирования базы данных


try
                   {
                       string q = "BACKUP DATABASE [CRMProduction] TO DISK= '" + txtLocation1.Text + "\\" + "Database" + "-" + System.DateTime.Now.Ticks.ToString() + ".bak'";
                                //+ " WITH FORMAT, MEDIANAME = 'Z_SQLServerBackups', NAME = 'Full Backup of CRMProduction';";
                       using (con = new SqlConnection(CS))
                       {
                           cmd = new SqlCommand(q, con);
                           if (con.State != ConnectionState.Open)
                           {
                               con.Open();
                           }
                           cmd.ExecuteNonQuery();
                           con.Close();

                           MessageBox.Show("Backup Completed...");
                           btnBackup.Enabled = true;
                           progressBar1.Visible = false;
                           lblProgressPercent.Visible = false;
                           btnCancel.Visible = false;
                           btnBackup.Enabled = true;
                           btnBrowse1.Enabled = true;
                           rdoBack.Checked = false;
                           rdoRest.Checked = false;
                           progressBar1.Value = 0;
                       }
                   }
                   catch (Exception ex)
                   {
                       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                   }


Что я уже пробовал:

я хочу создать резервную копию и восстановить ее, кодируя с помощью C#. я написал несколько кодов. но я получил ошибку, которая говорит: не удается открыть устройство резервного копирования 'C:\Users\Xyz\Desktop\bck\Database-636087712631488222.bak". Ошибка операционной системы 5(Доступ запрещен.). резервное копирование базы данных завершается ненормально.

я использую SQLSERVER 2008R2 с режимом аутентификации Sql Server. & мой SQLSERVER находится в Сети.

& я знаю, как создать резервную копию вручную или с помощью скрипта в SQL, но моя проблема заключается в коде C#. пожалуйста, помогите, если кто-нибудь знает.

[no name]

"Доступ запрещен" - это довольно очевидно, не так ли? В чем же тогда заключается Ваш вопрос?

Muhammad Rehbar Sheikh

я дал правильный путь назначения, так что даже я получил ошибку. мой код прост, я знаю это, но я хочу знать. есть ли какие-либо альтернативные настройки в SQLServer для создания резервной копии через приложение C#, в то время как SqlServer находится в сетевом режиме (подключен к 3 ПК). что же мне делать?

2 Ответов

Рейтинг:
5

OriginalGriff

Как говорит Дэйв, это проблема с папками.
Если вы посмотрите на это: Резервное копирование базы данных SQL на языке C#[^] он предоставляет код, который я использую, и объясняет подводные камни, на которые вы должны обратить внимание - whihc включает в себя (но не ограничивается) проблему доступа к папкам, с которой вы сталкиваетесь.

И никогда не объединяйте строки для формирования SQL-команды - даже резервной копии-вы оставляете свой код широко открытым для SQL-инъекции. Всегда используйте параметризованный запрос!


Muhammad Rehbar Sheikh

Да, сэр, может быть, это проблема с папкой. но как мне дать разрешение?
и я всегда использую параметризованный запрос. но только для этого вопроса я сделал конкатенацию строк. спасибо

OriginalGriff

Вы не можете, если не предоставите его вне приложения (поскольку для изменения разрешения потребуется доступ администратора). А если вы используете команду BACKUP, тогда процессу SQL требуется разрешение на доступ к папке - и он выполняется под учетной записью, не являющейся пользователем, на машине, на которой размещен SQL Server. Поэтому, если папка не находится на том же сервере, очень и очень маловероятно, что процесс SQL-сервера вообще будет иметь доступ к диску (не говоря уже о самой папке) на машине, к которой относится путь. Серьезно - посмотрите на ссылку, которую я вам дал, и она использует процесс на локальном компьютере (тот, который запускает этот код и взаимодействует с удаленным SQL-сервером) и под учетной записью локального пользователя. Это означает, что он наследует права доступа к папке пользователя на локальном компьютере, что, вероятно, гораздо более полезно!

Muhammad Rehbar Sheikh

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

OriginalGriff

Пожалуйста!

Рейтинг:
2

Dave Kreskowiak

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


Muhammad Rehbar Sheikh

так как же мне дать соответствующие разрешения папке, в которой будет храниться файл?

я уже дал разрешение на папку. любить
имя папки> & gt; Свойства & gt; & gt; безопасность> & gt; редактировать & gt; & gt; выбрать учетную запись> & gt; разрешить & gt; применить> & gt; ОК

сэр, есть ли другой способ дать разрешение??

Dave Kreskowiak

Неужели? Какой учетной записи вы дали разрешения, в какую папку и на какой машине? Являются ли ваша рабочая станция и SQL-сервер частью одного и того же ActiveDirectory? Какая учетная запись запускает задание резервного копирования на SQL Server?

Действительно, почему вы пытаетесь создать резервную копию удаленной базы данных на локальном компьютере? Обычно резервное копирование выполняется как запланированная настройка задания в SQL Server, а не вашим кодом.

Muhammad Rehbar Sheikh

ох !

на самом деле я не хочу создавать резервную копию вручную или по сценарию в SQLSERVER. вот почему я пытаюсь сделать резервную копию кода c#, когда захочу. так что, возможно, это моя вина. я попробую сделать это правильно. спасибо за ваше предложение, сэр.