Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf SMO:服务器';的还原失败';_Wpf_Sql Server_C# 4.0_Restore_Smo - Fatal编程技术网

Wpf SMO:服务器';的还原失败';

Wpf SMO:服务器';的还原失败';,wpf,sql-server,c#-4.0,restore,smo,Wpf,Sql Server,C# 4.0,Restore,Smo,我正在使用以下SMO代码尝试还原SQL Server数据库: Server _server; ServerConnection _conn; public void Restore(string destinationPath) { Restore res = new Restore(); _conn = new ServerConnection { ServerInstance = "." }; _server = new Server(_conn); try

我正在使用以下SMO代码尝试还原SQL Server数据库:

Server _server;
ServerConnection _conn;

public void Restore(string destinationPath)
{
   Restore res = new Restore();
   _conn = new ServerConnection { ServerInstance = "." };
   _server = new Server(_conn);

   try
   {
       string fileName = destinationPath;
       const string databaseName = "RelationAtOffice";

       res.Database = databaseName;
       res.Action = RestoreActionType.Database;
       res.Devices.AddDevice(fileName, DeviceType.File);

       res.PercentCompleteNotification = 10;
       res.ReplaceDatabase = true;
       res.PercentComplete += new PercentCompleteEventHandler(ProgressEventHandler);
       res.SqlRestore(_server);

       System.Windows.Forms.MessageBox.Show("Restore of " + databaseName + " Complete!", "Restore", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (SmoException exSMO)
    {
       System.Windows.Forms.MessageBox.Show(exSMO.ToString());
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.ToString());
    }
}
为什么要将下面的代码链接到正确答案。但是我的代码不起作用了? 代码就像在一起。我使用了wpf和下面的链接用户winapp

SMO错误:

Microsoft.SqlServer.Management.Smo.FailedOperationException:还原 服务器“MORTEZA”失败。
--->Microsoft.SqlServer.Management.Smo.Smo异常:
System.Data.SqlClient.SqlError:无法获得独占访问权限 因为数据库正在使用中。
位于Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQueryWithMessage(StringCollection 查询,ServerMessageEventHandler dbccMessageHandler,布尔值 错误消息)
位于Microsoft.SqlServer.Management.Smo.BackupRestoreBase.ExecuteSql(服务器 服务器,StringCollection查询)
在Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(服务器srv)上
在RelationAtOfficeApp.Admin.AdministratorMainPage.Restore(字符串 目的路径)在 E:\prozhe\RelationAtOfficeApp\RelationAtOfficeApp\RelationAtOfficeApp\Admin\AdministratorMainPage.xaml.cs:第268行


最可能的原因是:

  • 您已从服务器进行备份-已将
    Data.mdf
    Data\u Log.ldf
    备份到
    backup.bak
    文件中

  • 在同一台(服务器)计算机上,您现在正尝试恢复同一个数据库

在这种情况下,应覆盖
.mdf
.ldf
,但这不会发生,因为SQL Server仍控制着该数据库,因此恢复失败,因为无法覆盖数据和日志文件

有两种方法可以解决此问题:

  • 定义“文件重新定位”,例如,在恢复时定义新的数据和日志文件名。这样,您的数据库现在将被恢复,文件将以新名称放置在SQL Server数据目录中

    这需要类似于他的代码:

    ....  
    res.Devices.AddDevice(fileName, DeviceType.File);
    
    // define "file relocation" - for all "logical" files in a SQL Server database,
    // define a new physical location where the file will end up at          
    RelocateFile relocateDataFile = new RelocateFile("Data", @"(your data dir)\RestoredData.mdf");
    RelocateFile relocateLogFile = new RelocateFile("Log", @"(your log dir)\Data\RestoredData_log.ldf");
    
    res.RelocateFiles.Add(relocateDataFile);
    res.RelocateFiles.Add(relocateLogFile);
    
  • 如果不希望创建新文件,则应能够通过设置以下内容来指定要使用还原操作替换现有数据库的to SMO Restore:

    res.ReplaceDatabase = true;
    
    打电话之前

    res.SqlRestore(_server);
    
  • 更新:我在示例中使用的逻辑文件名当然只是示例-在您的情况下,备份文件很可能包含其他逻辑文件名,您需要在代码中使用这些文件名

    您可以通过两种方式找到数据库包含的逻辑文件名:

  • 正如错误消息明确指出的那样-您可以在SQL Server Management Studio中使用
    还原
    命令上的
    FILELISTONLY
    选项,从而在还原
    .bak
    文件之前检查该文件。试着这样做:

    RESTORE FILELISTONLY
    FROM DISK = N'path-and-full-file-name-of-your-bak-file-here.bak'
    
    这将为您提供一个小网格,其中包含
    .bak
    文件中包含的逻辑和物理文件名

  • 如果数据库仍连接到服务器,则可以使用SQL server Management Studio中的
    对象资源管理器
    ,找出数据库的逻辑文件名;右键单击您选择的数据库,然后您将看到此对话框,在
    文件
    部分,您将获得要查找的信息:

  • 除此之外,您还可以解决在
    .SqlRestore()前面添加一行代码时出现的“数据库正在使用”错误:

    这将模拟与Sql Server Management Studio还原完全相同的行为:


    您能复制准确的错误消息吗?错误消息:服务器“King”的还原失败您正在尝试还原到现有数据库,但仍有人在其中。“某人”可以是您自己的会话之一,因此请确保其中没有一个会话持续存在于该数据库中;res.SqlRestore(_服务器);但这是错误:Microsoft.SqlServer.Management.Smo.FailedOperationException:服务器“MORTEZA”的还原失败。-->Microsoft.SqlServer.Management.Smo.Smo异常:System.Data.SqlClient.SqlError:无法获得独占访问权限,因为数据库正在使用中。at@MMDMNC:我在回答中展示了两种解决方案-尝试解决方案#1!使用
    Restore
    上的
    RelocateFiles
    属性…错误尝试解决方案#1:smo:Microsoft.SqlServer.Management.smo.FailedOperationException:服务器“MORTEZA”的还原失败。-->Microsoft.SqlServer.Management.Smo.Smo异常:System.Data.SqlClient.SqlError:逻辑文件“Data”不是数据库“RelationaOffice”的一部分。使用RESTORE FILELISTONLY可列出逻辑文件名。在Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteOnQueryWithMessage(StringCollection查询、ServerMessageEventHandler dbccMessageHandler、Boolean errorsAsMessages)…@MMDMNC:在这种情况下,您的文件具有不同的逻辑文件名-您需要找出这些文件名是什么(使用该命令-
    仅还原文件列表
    ),然后在SMO应用程序中使用正确的逻辑文件名!
    _server.KillAllPrecesses("MyDatabaseName");
    res.SqlRestore(_server);