vijay_bale Ответов: 2

Невозможно создать резервную копию базы данных SQL в C# на стороне клиента


Мое программное обеспечение установлено в 3 системах. 1. это основная серверная система, а остальные два-клиенты. включите эту серверную систему и запустите программное обеспечение в 2 клиентских системах, а также обмен данными, такими как обновление, вставка, прием отчетов и т. д. После работы я хочу сделать резервную копию в самих клиентских системах. Для этого я написал один код C#, но я не могу сделать резервную копию в клиентских системах.Он создает одну папку, но не смог создать файл. Тот же код, если я запустил на сервере, то резервное копирование работает.

Вот мой код

string drive = Path.GetPathRoot("D:");   // e.g. K:\
                con.Close();
                con.Open();

                if (!Directory.Exists(drive))
                {
                    MessageBox.Show("Drive " + drive + " not found or inaccessible",
                                    "Error", MessageBoxButtons.OK);
                    con.Close();
                    con.Open();
                    CreateIfMissing("C:\\Billindiaback");
                    string query = string.Format("BACKUP DATABASE inventoryDB  TO DISK = 'C:\\Billindiaback\\InventoryDB{0}.Bak' WITH FORMAT, MEDIANAME = 'dbName', NAME = 'Full Backup of dbName';", DateTime.Now.ToString("hhmmssddMMyyyy"));
                    SqlDataAdapter sda = new SqlDataAdapter(query, con);
                    sda.SelectCommand.ExecuteNonQuery();
                    con.Close();

                }
                else
                {
                    con.Close();
                    con.Open();
                    CreateIfMissing("D:\\Billindiaback");
                    string query = string.Format("BACKUP DATABASE inventoryDB  TO DISK = 'D:\\Billindiaback\\InventoryDB{0}.Bak' WITH FORMAT, MEDIANAME = 'dbName', NAME = 'Full Backup of dbName';", DateTime.Now.ToString("hhmmssddMMyyyy"));
                    SqlDataAdapter sda = new SqlDataAdapter(query, con);
                    sda.SelectCommand.ExecuteNonQuery();
                //MessageBox.Show(sda.SelectCommand.ExecuteNonQuery().ToString());

                }


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

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

F-ES Sitecore

Он будет использовать эти папки на сервере, где выполняется резервное копирование, а не на клиенте, откуда вы его вызываете. Попробуйте сохранить резервную копию в сетевую папку, которая сопоставляется с клиентом, например \\clientname\somefolder\somefile.bak - хотя и не уверен, что это поддерживается.

vijay_bale

На стороне клиента, в какой системе дисков будет создана эта папка

2 Ответов

Рейтинг:
1

Dave Kreskowiak

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

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

Ваш код не имеет ничего общего с этой проблемой, кроме указания неправильного пути для записи резервной копии.


Рейтинг:
0

massimiliano aronica

1. Я бы не стал использовать класс SqlDataAdapter, он не подходит для вашей цели. Все что вам нужно это SqlCommand :

Sqlcommand, который комми= новый sqlcommand, который(запрос,objConnection)
возражение.Открыть();
связь.Метод executenonquery();
возражение.Закрывать();

2.Убедитесь, что у вас есть права на запись в папку, в которую вы указываете резервное копирование.
3.Если вам нужен резервный файл на стороне клиента, загрузите его из сгенерированного файла.

Если я не ошибаюсь, ExecuteNonQuery имеет асинхронное выполнение, так что вы можете получить контроль обратно, когда резервное копирование, вероятно, еще не завершено. Позаботься об этом.

Приветствую вас!! :)