如何修改ASP.NET Core代码将在线SQL Server备份至本地指定路径?
解决ASP.NET Core远程SQL Server备份到本地电脑的问题
你遇到的错误核心是SQL Server的BACKUP DATABASE命令在数据库服务器端执行,代码里指定的C:\DatabaseBackupFile\是远程SQL服务器的本地路径,而非你自己电脑的路径,服务器找不到该目录才抛出“系统找不到指定路径”的错误。
方案一:先备份到服务器本地,再下载到客户端(推荐)
这种方法安全且易实现,步骤为:先将数据库备份到远程SQL服务器的可访问目录,再通过ASP.NET Core将备份文件下载到本地指定路径。
修改后的代码示例:
public async Task<IActionResult> TakeDatabaseBackup() { try { var connectionString = "Data Source=SQLOnlineWebServer.com;Initial Catalog=DatabaseName;User Id=DatabaseUserName;Password=123456789"; // 远程SQL服务器上的备份目录(需提前创建并给SQL Server服务账号分配读写权限) var serverBackupFolder = @"D:\SQLBackups\"; Directory.CreateDirectory(serverBackupFolder); var sqlConStrBuilder = new SqlConnectionStringBuilder(connectionString); var backupFileName = $"{sqlConStrBuilder.InitialCatalog}-{GetLocalDateTime().ToString("MM-dd-yyyy-hh-mm-tt")}.bak"; var serverBackupPath = Path.Combine(serverBackupFolder, backupFileName); // 执行服务器端备份 using (var connection = new SqlConnection(sqlConStrBuilder.ConnectionString)) { // 用[]包裹数据库名,避免名称含特殊字符报错 var query = $"BACKUP DATABASE [{sqlConStrBuilder.InitialCatalog}] TO DISK='{serverBackupPath}' WITH INIT"; using (var command = new SqlCommand(query, connection)) { connection.Open(); command.ExecuteNonQuery(); } } // 将服务器备份文件下载到本地 var localBackupFolder = @"C:\DatabaseBackupFile\"; Directory.CreateDirectory(localBackupFolder); var localBackupPath = Path.Combine(localBackupFolder, backupFileName); // 若应用与SQL Server同服务器,直接拷贝;不同服务器则需用SMB共享/FTP等方式获取文件 File.Copy(serverBackupPath, localBackupPath, overwrite: true); // 可选:删除服务器上的备份文件节省空间 File.Delete(serverBackupPath); return Json(new { type = "success" }); } catch (Exception ex) { return Json(new { type = "error", message = ex.Message }); } } private DateTime GetLocalDateTime() { return DateTime.Now; // 可根据需求改为UTC时间或服务器本地时间 }
注意事项
- 必须给SQL Server服务账号分配远程服务器备份目录的读写权限。
- 若ASP.NET Core应用与SQL Server不在同一服务器,需通过SMB共享、FTP或接口调用方式获取服务器上的备份文件,直接
File.Copy仅适用于同服务器场景。
方案二:让SQL Server直接访问本地共享目录(不推荐,配置复杂)
若需直接备份到本地电脑,需完成以下配置:
- 在本地电脑创建共享目录
C:\DatabaseBackupFile\,授予远程SQL Server服务账号(域账号或本地账号)完全控制权限。 - 修改备份命令,使用本地电脑的网络路径(如
\\你的电脑IP\DatabaseBackupFile\)。 - 确保远程SQL服务器能访问本地共享目录(防火墙开放相关端口、网络环境允许)。
修改后的备份命令片段:
var localSharedPath = @"\\192.168.1.100\DatabaseBackupFile\"; // 替换为你的电脑IP和共享名 var fullBackupPath = Path.Combine(localSharedPath, backupFileName); var query = $"BACKUP DATABASE [{sqlConStrBuilder.InitialCatalog}] TO DISK='{fullBackupPath}' WITH INIT";
这种方法对网络环境和权限配置要求极高,易出现权限不足或网络不通问题,不建议用于生产环境。
内容的提问来源于stack exchange,提问作者Hedayat Hoshmand
相关产品推荐
相关产品推荐

