为什么 C# 不创建 SSMS 备份?

Why will C# not Create an SSMS Back-up?

我有以下代码来创建数据库的备份。

public void CreateBackup()
{
    if (_database.Database.CanConnect() == false)
    {
        throw new Exception("No connection to the Database could be established.");
    }

    _database.Database.ExecuteSqlCommand($@"BACKUP DATABASE {_databaseSettings.DestinationSettings.SSMSDatabaseName} TO DISK='{_databaseSettings.BackupSettings.BackupFilePath}{Path.DirectorySeparatorChar}{_databaseSettings.DestinationSettings.SSMSDatabaseName}_{DateTime.Now.ToString("dd-MMMM-yyyy HH_mm")}.bak'");
}

ExecuteSqlCommand 会被转换成

BACKUP DATABASE databasename TO DISK='D:\backup\databasename_03-november-2021 15_52.bak'

当我通过 SSMS 查询提示 运行 此 SQL 命令时,它将开始创建备份,没有任何问题。当我 运行 上面的代码时,它应该做的基本上是一样的,它将花费与创建备份相同的时间,但实际上不会创建备份。我试图 运行 在与托管数据库的计算机相同的计算机上使用此应用程序。这并没有什么不同。我没有收到来自应用程序的错误。

谁能帮我解释一下?

我阅读和检查过的资源:

由于它花费的时间与您在 SSMS 查询提示中 运行 花费的时间大致相同,因此可以安全地假设它实际上正在完成。因此,它是以下情况之一:

  • 它位于您不搜索它的地方
  • 它被保存,然后由于某种原因被删除
  • 它没有路径的访问权限
  • ExecuteSqlCommand 抛出异常

现在,要找出具体情况下的确切问题(和解决方案),您需要调试代码并查看内容

{_databaseSettings.BackupSettings.BackupFilePath}{Path.DirectorySeparatorChar}{_databaseSettings.DestinationSettings.SSMSDatabaseName}_{DateTime.Now.ToString("dd-MMMM-yyyy HH_mm")}.bak

评估为。尝试找到路径。如果路径不存在,那么您可能需要创建文件夹并为执行代码的用户授予对它们的访问权限。如果找到路径并生成文件,那么它只是指向与您期望保存目标的位置不同的位置。如果路径存在,但文件不存在,则检查权限。如果 ExecuteSqlCommand 行抛出异常,则正在登录的数据库用户可能缺少某些权限。

所以,简而言之,调试你的代码,看看它是否中断。如果是这样,请修复错误。如果不是,请搜索该文件,但首先要找出该文件将保存到的实际路径。如果未找到该文件,请检查您是否具有必要的权限。如果是,找出删除文件的原因。

从 OP 编辑​​: 这个答案提供了正确的信息。正如 Jeroen Mostert 评论的那样,通过通读 sp_readerrolog 确认信息更容易完成。