首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不同DataBases时的SqlRestore问题

使用不同DataBases时的SqlRestore问题
EN

Stack Overflow用户
提问于 2010-08-05 17:33:35
回答 1查看 263关注 0票数 0

我有一些项目,可以在不同名称的数据库上运行。我在我的程序中有一些执行数据库备份和恢复的功能。问题是当我尝试将数据库从备份恢复到具有不同名称的其他数据库时,等等。我的代码如下所示:

代码语言:javascript
复制
        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输出的错误如下:

代码语言:javascript
复制
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"),以后可以在原始数据库中替换其中的文件?也许我的代码在某个地方不正确,有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-17 17:10:23

我通过保留现有的数据库名称解决了这个问题,如下所示:

代码语言:javascript
复制
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;
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3413419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档