【发布时间】:2021-12-15 17:40:21
【问题描述】:
我创建了一个名为 mydb 的 SQL Server 数据库的备份。我需要使用 C# 代码以编程方式恢复它。
还原必须创建一个名为 mydbnew 的新数据库。我正在使用 Microsoft.SqlServer.Management.Smo 库。
代码是这样的:
public void RestoreDatabase()
{
string databaseName = "mydbnew";
string userName = "user";
string password = "password";
string serverName = "(local)\\SQLEXPRESS";
string sourcePath = @"c:\temp\";
string fileName = $"mydbbackup.bak";
ServerConnection connection = new(serverName, userName, password);
Server sqlServer = new Server(connection);
BackupDeviceItem deviceItem = new(sourcePath + fileName, DeviceType.File);
Restore restore = new Restore();
restore.Database = databaseName;
restore.ReplaceDatabase = true;
restore.NoRecovery = false;
restore.Devices.Add(deviceItem);
RelocateFile dataFile = new RelocateFile();
dataFile.LogicalFileName = databaseName + "_data";
dataFile.PhysicalFileName = databaseName + ".mdf";
RelocateFile logFile = new RelocateFile();
logFile.LogicalFileName = databaseName + "_log";
logFile.PhysicalFileName = databaseName + ".ldf";
restore.RelocateFiles.Add(dataFile);
restore.RelocateFiles.Add(logFile);
restore.SqlRestore(sqlServer);
restore.Devices.Remove(deviceItem);
}
restore.SqlRestore(sqlServer) 出现错误:
逻辑文件“mydbnew_log”不是数据库“mydbnew”的一部分。使用 RESTORE FILELISTONLY 列出逻辑文件名。
RESTORE DATABASE 异常终止。
我的代码有什么问题?
【问题讨论】:
-
错误在这里告诉你问题。您告诉 SQL Server,您要恢复的数据库有一个名为
mydbnew_log的文件,但备份中不存在这样的文件。 -
目标数据库中日志文件的实际逻辑名称是什么
mydbnew -
@Larnu 好的,但我试图告诉 SqlServer 我需要使用新名称将备份中的 mdf 和 ldf 文件恢复到新数据库:“mydb.ldf => mydbnew.ldf”和“mydb.mdf => mydbnew.mdf”。如果我删除重定位尝试,结果是错误:“文件 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\mydb.mdf' 不能被覆盖。它正在被数据库 'mydb '。”
-
然后使用需要使用
MOVE子句,@Tonyc。
标签: c# sql-server smo