从联网的SQLServer恢复SMO永远不会完成(从C#调用)

时间:2012-02-24 08:28:07

标签: c# smo database-restore

我尝试将数据库从联网的SQLServer复制到本地SQLExpress:

private void DoRestore()
    {
         if (!File.Exists(fileNach))
         {
             MessageBox.Show("Restore gescheitert " + fileNach);
             return;
         }

        Restore res = new Restore();
        Server srv = new Server(Environment.MachineName.ToString()+@"\SQLEXPRESS");
        //MessageBox.Show("Ziel Server :"+srv.Name);

        try
        {
            string fileName = @fileNach;
            string databaseName = "Outdoor";
            srv.KillAllProcesses(databaseName);
            res.Database = databaseName;
            res.Action = RestoreActionType.Database;
            res.Devices.AddDevice(fileName, DeviceType.File);
            res.ReplaceDatabase = true;
            res.NoRecovery = true;

            string odb;
            string odblog;
            odb = @"C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Outdoor.mdf";
            odblog = @"C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Outdoor.ldf";

            res.RelocateFiles.Add(new RelocateFile("Outdoor", odb));
            res.RelocateFiles.Add(new RelocateFile("Outdoor_Log", odblog));

            // restore starten
            res.SqlRestore(srv);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
}

此代码在SQLExpress上启动恢复过程但永远不会结束。 mdf和日志文件在目标目录中创建,但还原不会完成。

我也试过srv.KillAllProcesses(databaseName);,但没有结果。

在C#级别没有引发错误。

1 个答案:

答案 0 :(得分:1)

你说它永远不会结束,是你看到你的代码完成但是数据库停留在“恢复”模式?如果是这样,我认为您希望恢复恢复,否则您将使数据库无法运行。尝试将NoRecovery设置为false而不是true:

res.NoRecovery = false;

来自here

  1. 通过回滚未提交的数据库使数据库可供使用 交易。无法还原其他事务日志。 (恢复恢复

    恢复数据库。此选项相当于RECOVERY Transact-SQL RESTORE语句中的选项。

    仅当您没有所需的日志文件时才选择此选项 还原

  2. 让数据库无法运行,不要回滚 未提交的交易。其他事务日志可以是 恢复。 ( RESTORE WITH NORECOVERY

    使数据库处于未恢复状态。这个选项是 相当于在Transact-SQL RESTORE中使用NORECOVERY选项 言。

    选择此选项时,保留复制设置 选项不可用。