c#SMO备份-如何使用ExpirationDate?

时间:2019-01-16 09:09:52

标签: c# sql-server datetime smo

我大致遵循this example来使用Microsoft的SMO API备份数据库,并且代码崩溃,并告知invalid parameter ExpirationDate异常。我检查了the documentation,其中不包含有关如何设置参数的详细信息,而且我的直觉告诉我应该在将来使用,对吧?我很好奇,并测试了一些值:

  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)->工作正常

读取this 5 year-old post可能是内部参数实际上不是DateTime类型吗?但这将是一个错误,对吧?

2 个答案:

答案 0 :(得分:0)

这些错误可能是由于设置Backup.ExpirationDate属性的语言环境引起的。根据执行此操作所使用的文化,DateTime.AddDays方法可能会增加月份而不是预期的日期,从而导致您看到的结果不一致。在您测试的值中,只有负数会导致错误,因为备份到期日期的天数范围是0-99999,其中0表示备份将永不过期,如documentation中所述。尝试使用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);

答案 1 :(得分:0)

edit 我非常困惑。我以为这解决了我的问题:

  

我的问题是我没有给backup.ExpirationDate.AddDays(X)分配任何电话。因此,该软件基本上使用的是“ DateTime.Now”。

     

解决方案:   backup.ExpirationDate = backup.ExpirationDate.AddDays(X);

但是并没有完全做到。如果这样做,我仍然会得到例外:

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

不知道为什么此代码是错误的。