我有一些项目,可以在不同名称的数据库上运行。我在我的程序中有一些执行数据库备份和恢复的功能。问题是当我尝试将数据库从备份恢复到具有不同名称的其他数据库时,等等。我的代码如下所示:
public void Restore(string backupFilePath, string toDatabase)
{
// Kill database if exists
Database db = server.Databases[toDatabase];
RecoveryModel recoverymod = RecoveryModel.Full;
if (db != null)
{
recoverymod = db.DatabaseOptions.RecoveryModel;
server.KillAllProcesses(toDatabase);
}
// Restore to database
var bdi = new BackupDeviceItem(backupFilePath, DeviceType.File);
var restore = new Restore();
restore.Devices.Add(bdi);
restore.FileNumber = restore.Devices.IndexOf(bdi);
restore.Database = toDatabase;
restore.KeepReplication = true;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;
//restore.Restart = true;
restore.NoRecovery = false;
string dbFolder = Path.Combine(server.InstallDataDirectory, "DATA");
string backupDBName = toDatabase; //Path.GetFileName(backupFilePath).Split('_')[0];
restore.RelocateFiles.Add(new RelocateFile(backupDBName, Path.Combine(dbFolder, toDatabase + ".MDF")));
restore.RelocateFiles.Add(new RelocateFile(backupDBName + "_log",
Path.Combine(dbFolder, toDatabase + ".LDF")));
restore.SqlRestore(server);
// Startup database
db = server.Databases[toDatabase];
db.DatabaseOptions.RecoveryModel = recoverymod;
db.SetOnline();
while (((int)db.Status & (int)DatabaseStatus.Normal) != (int)DatabaseStatus.Normal)
{
Thread.Sleep(1000);
}
}但是SQL输出的错误如下:
Msg 3234, Level 16, State 2, Line 1
Logical file 'ServeDB7' is not part of database 'ServeDB7'. Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.我认为这是因为可以从具有不同逻辑名称的数据库中进行备份,例如"Serve“、"Serve2”、"serve3“或类似的名称。
或者它放入一些其他错误,即该文件不能被移动,因为其他数据库正在使用它。也许有什么方法可以为临时数据库定义一个数据库名称(如"temporaryDB"),以后可以在原始数据库中替换其中的文件?也许我的代码在某个地方不正确,有人能帮我吗?
发布于 2010-08-17 17:10:23
我通过保留现有的数据库名称解决了这个问题,如下所示:
string backupDBName = GetDbNameFromBackup(restore);
restore.RelocateFiles.Add(new RelocateFile(backupDBName, Path.Combine(dbFolder, toDatabase + ".MDF")));
restore.RelocateFiles.Add(new RelocateFile(backupDBName + "_log", Path.Combine(dbFolder, toDatabase + ".LDF")));
restore.SqlRestore(server);
private string GetDbNameFromBackup(Restore restore)
{
string originalDbName = null;
if (restore != null && this.server != null)
{
DataTable restoreInfo = restore.ReadFileList(this.server);
if (restoreInfo.Rows.Count > 0)
{
object[] cols = restoreInfo.Rows[0].ItemArray;
if (cols != null && cols.Count() > 0)
{
if (cols[0] is string && !String.IsNullOrEmpty((string)cols[0]))
{
originalDbName = (string)cols[0];
}
}
}
}
return originalDbName;
}https://stackoverflow.com/questions/3413419
复制相似问题