SQL Server выполняет резервное копирование с помощью C#

#c# #sql-server-2008 #backup

#c# #sql-server-2008 #резервное копирование

Вопрос:

Я исследовал возможности создания резервных копий базы данных с помощью SMO с C #. Задача довольно проста, а код понятен. У меня только один вопрос: как я могу проверить, действительно ли была создана резервная копия?

Резервное копирование SqlBackup.Метод SqlBackup не возвращает параметров, и я даже не знаю, выдает ли он какие-либо исключения. (единственное, что я знаю, это то, что это блокирует, потому что есть также метод SqlBackupAsync)

Я был бы признателен за любую помощь.

Комментарии:

1. Я сам никогда этим не пользовался, но, просмотрев документы, можно предположить, что вы могли бы прикрепить обработчик событий к Complete , чтобы посмотреть, возвращает ли он код ошибки. Но я не уверен на 100%, что это будет вызвано в неасинхронном случае, и должен быть способ получше!

Ответ №1:

вы можете, и это очень возможно, сделать то, о чем вы просили,

но выполнить резервное копирование самостоятельно с помощью SMO не очень сложно, но сложная часть заключается в управлении резервным копированием и восстановлением.

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

Резервное копирование SqlBackup.SqlBackup не возвращает никакого значения, это функция void. но он принимает один параметр, который является «Server», попробуйте следующий код:

 Server srvSql;

//Connect to Server using your authentication method and load the databases in srvSql
// THEN

Backup bkpDatabase = new Backup();
bkpDatabase.Action = BackupActionType.Database;
bkpDatabase.Incremental = true; // will take an incemental backup
bkpDatabase.Incremental = false; // will take a Full backup 
bkpDatabase.Database = "your DB name";
BackupDeviceItem bDevice = new BackupDeviceItem("Backup.bak", DeviceType.File);
bkpDatabase.Devices.Add(bDevice );

bkpDatabase.PercentCompleteNotification = 1;// this for progress
bkpDatabase.SqlBackup(srvSql);
bkpDatabase.Devices.Clear();
  

Комментарии:

1. Я думаю, он хочет знать, не удалось ли выполнить задание. Как вы можете это проверить?

2. У меня уже есть код, который вы предоставили 🙂 Дело в том, что я хочу быть на 100% уверен, что операция резервного копирования прошла успешно, что крайне важно для того, что я хочу сделать.

3. можете ли вы проверить это на завершенном событии?

Ответ №2:

Я исследовал проблему с помощью Reflector.NET (Я полагаю, это законно, поскольку RedGate является сертифицированным партнером Ms Gold и отражателем.NET открывает библиотеки .NET из коробки). Как я выяснил, метод выдает два типа исключений:

Исключение FailedOperationException — в большинстве случаев другие исключения «переводятся» (я полагаю, перевод означает создание нового исключения FailedOperationException и установку InnerException на то, что было фактически выдано)

Исключение UnsupportedVersionException — в одном случае, когда для усечения журнала установлено значение TruncateOnly, а основная версия сервера больше или равна 10 (которая является sql server 2008?)

Это частично решает мою проблему, потому что я не уверен на 100%, что если что-то пойдет не так, эти исключения действительно будут сгенерированы.