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服务器创建目标路径并授权
- 登录SQL OnlineWebServer.com服务器,手动创建
C:\DatabaseBackupFile\文件夹。 - 打开Windows服务管理器,找到SQL Server服务(如
SQL Server (MSSQLSERVER)),查看其运行账号(通常是NT SERVICE\MSSQLSERVER或自定义账号)。 - 给该账号分配
C:\DatabaseBackupFile\文件夹的读写权限。 - 代码无需修改路径,保持原逻辑即可(建议用
Path.Combine拼接路径避免格式问题)。
方案2:备份到Web应用服务器的共享文件夹
- 在Web应用服务器上创建共享文件夹,设置权限允许SQL Server服务账号访问。
- 将备份路径替换为网络共享路径,例如
\\WebServerIP\BackupShare\。 - 确保SQL Server服务账号拥有访问该共享文件夹的权限。
方案3:使用SQL Server默认备份目录(最简便)
SQL Server自带默认备份目录,且默认拥有访问权限,无需额外配置:
- 执行以下SQL查询获取默认备份路径:
SELECT SERVERPROPERTY('BackupDirectory') AS DefaultBackupPath;
- 修改代码使用该路径,示例代码如下:
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
相关产品推荐
相关产品推荐

