You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 2.1在线数据库备份遇SqlException错误求解决方案

解决ASP.NET Core线上数据库备份路径错误问题

问题根源

你遇到的错误核心原因是:

  • BACKUP DATABASE命令是在SQL Server所在的远程服务器上执行的,代码中指定的C:\DatabaseBackupFile\路径是Web应用服务器的本地路径,而非SQL Server服务器的路径,远程SQL Server找不到这个目录,因此报错。
  • 本地测试时,SQL Server和Web应用在同一台机器,路径存在,所以备份成功。

可行解决方案

方案1:在SQL Server服务器创建目标路径并授权

  1. 登录SQL OnlineWebServer.com服务器,手动创建C:\DatabaseBackupFile\文件夹。
  2. 打开Windows服务管理器,找到SQL Server服务(如SQL Server (MSSQLSERVER)),查看其运行账号(通常是NT SERVICE\MSSQLSERVER或自定义账号)。
  3. 给该账号分配C:\DatabaseBackupFile\文件夹的读写权限。
  4. 代码无需修改路径,保持原逻辑即可(建议用Path.Combine拼接路径避免格式问题)。

方案2:备份到Web应用服务器的共享文件夹

  1. 在Web应用服务器上创建共享文件夹,设置权限允许SQL Server服务账号访问。
  2. 将备份路径替换为网络共享路径,例如\\WebServerIP\BackupShare\。
  3. 确保SQL Server服务账号拥有访问该共享文件夹的权限。

方案3:使用SQL Server默认备份目录(最简便)

SQL Server自带默认备份目录,且默认拥有访问权限,无需额外配置:

  1. 执行以下SQL查询获取默认备份路径:
SELECT SERVERPROPERTY('BackupDirectory') AS DefaultBackupPath;
  1. 修改代码使用该路径,示例代码如下:
public IActionResult TakeDatabaseBackup()
{
    try
    {
        var connectionString = "Data Source=SQLOnlineWebServer.com;Initial Catalog=DatabaseName;User Id=DatabaseUserName;Password=123456789";
        var sqlConStrBuilder = new SqlConnectionStringBuilder(connectionString);

        // 获取SQL Server默认备份目录
        string defaultBackupPath = string.Empty;
        using (var connection = new SqlConnection(sqlConStrBuilder.ConnectionString))
        {
            connection.Open();
            var cmd = new SqlCommand("SELECT SERVERPROPERTY('BackupDirectory')", connection);
            defaultBackupPath = cmd.ExecuteScalar().ToString();
        }

        // 构造备份文件名,用Path.Combine避免路径拼接错误
        var backupFileName = Path.Combine(defaultBackupPath, 
            $"{sqlConStrBuilder.InitialCatalog}-{GetLocalDateTime().ToString("MM-dd-yyyy-hh-mm-tt")}.bak");

        // 执行备份命令,给数据库名加[]避免特殊字符问题
        using (var connection = new SqlConnection(sqlConStrBuilder.ConnectionString))
        {
            var query = $"BACKUP DATABASE [{sqlConStrBuilder.InitialCatalog}] TO DISK='{backupFileName}' WITH INIT";
            using (var command = new SqlCommand(query, connection))
            {
                connection.Open();
                command.ExecuteNonQuery();
            }
        }
        return Json(new { type = "success" });
    }
    catch (Exception ex)
    {
        // 返回异常信息便于调试,不要吞掉错误
        return Json(new { type = "error", message = ex.Message });
    }
}

额外注意事项

  • 用Path.Combine拼接路径,避免手动拼接出现斜杠格式问题。
  • 给数据库名称添加[]包裹,防止数据库名包含空格或特殊字符导致SQL语法错误。
  • WITH INIT参数会覆盖同名备份文件,若需要追加备份可改为WITH NOINIT。
  • 不要捕获空异常,保留异常信息有助于快速排查问题。

内容的提问来源于stack exchange,提问作者Hedayat Hoshmand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:12:42