c # SMO Backup - как использовать ExpirationDate? - PullRequest
0 голосов
/ 16 января 2019

Я следовал примерно этому примеру для резервного копирования базы данных с помощью SMO API от Microsoft и произошел сбой кода с исключением invalid parameter ExpirationDate. Я проверил документацию , которая не содержит подробностей о том, как установить параметр, и моя интуиция подсказала мне, что это должно произойти в будущем, верно? Мне было любопытно и проверил некоторые значения:

  1. DateTime.Today.AddDays (10) -> InvalidDataException
  2. DateTime.Today.AddDays (-10) -> отлично работает
  3. DateTime.Today.AddDays (-5) -> отлично работает
  4. DateTime.Today.AddDays (-4) -> отлично работает
  5. DateTime.Today.AddDays (-3) -> InvalidDataException
  6. DateTime.Today.AddDays (-1) -> InvalidDataException
  7. DateTime.Today.AddDays (100) -> InvalidDataException
  8. DateTime.Today.AddDays (500) -> InvalidDataException
  9. DateTime.Today.AddDays (1000) -> отлично работает

Чтение этого 5-летнего поста возможно, что внутренний параметр на самом деле не имеет тип DateTime? Но тогда это будет ошибка, верно?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

edit Я очень запутался. Я думал, что это решило мою проблему:

Моя проблема заключалась в том, что я позвонил backup.ExpirationDate.AddDays(X), не назначая его ни на что. Таким образом, программное обеспечение в основном использует "DateTime.Now".

Решение: backup.ExpirationDate = backup.ExpirationDate.AddDays(X);

Но это не полностью. Я все еще получаю исключение, если я делаю это:

backup.ExpirationDate = backup.ExpirationDate.AddDays(1);

Не знаю, почему этот код неправильный.

0 голосов
/ 17 января 2019

Эти ошибки, вероятно, являются результатом локали, из которой устанавливается свойство Backup.ExpirationDate. В зависимости от культуры, в которой он выполняется, метод DateTime.AddDays может увеличивать месяц вместо дня, как ожидалось, что приводит к противоречивым результатам, которые вы видели. Из значений, которые вы тестировали, только отрицательные должны вызывать ошибки, так как диапазон дней для срока действия резервной копии составляет 0 - 99999, при этом 0 указывает, что срок действия резервной копии никогда не истечет, как указано в документации . Попробуйте использовать класс CultureInfo для определения новой локали, а затем установите срок действия. Для этого потребуется ссылка на пространство имен System.Globalization. Выполнение следующего кода не дало мне никаких ошибок при установке даты истечения срока действия в операции резервного копирования с использованием культуры США (en-US). Просто убедитесь, что дата в культуре, которую вы конвертируете, совпадает с датой, которую вы ожидаете в своем часовом поясе.

using System.Globalization;

            string folderPath = @"C:\YourFolder\";

            Server serv = new Server(@"YourServer");
            Backup bkup = new Backup();
            bkup.Database = "YourDatabase";

            string bkupFilePath = folderPath + bkup.Database.ToString() + ".bak";

            bkup.Action = BackupActionType.Database;
            bkup.Devices.AddDevice(bkupFilePath, DeviceType.File);
            bkup.BackupSetName = "YourDatabase Full Backup";
            bkup.BackupSetDescription = "Full backup of YourDatabase";

            DateTime today = DateTime.Now;

            //define current date representation with en-US culture
            string newLocale = today.ToString(new CultureInfo("en-US"));

            //set Backup.ExpirationDate to use new culture
            bkup.ExpirationDate = Convert.ToDateTime(newLocale);

            bkup.ExpirationDate.AddDays(10);
            bkup.ExpirationDate.AddDays(100);
            bkup.ExpirationDate.AddDays(500);
            bkup.ExpirationDate.AddDays(1000);

            bkup.SqlBackup(serv);
...