2011-09-19 75 views
0

我正在将SQL数据库备份和恢复部分插入到我的程序中。我一直在使用MSDN示例(尝试另一个,它不会工作)。 MSDN页面 - http://msdn.microsoft.com/en-us/library/ms162133.aspxC#恢复数据库卡在'还原...'

我有备份文件的工作,并已在Management Studio中测试该文件。

但我在恢复文件时遇到了问题。

的代码似乎是工作,但在SQL Server数据库是停留在“恢复......”

  if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       Server sqlServer = new Server(); 

       Restore sqlRestore = new Restore(); 
       sqlRestore.NoRecovery = true; 
       sqlRestore.Action = RestoreActionType.Database; 

       BackupDeviceItem deviceItem = new BackupDeviceItem(openFile.FileName, DeviceType.File); 
       sqlRestore.Devices.Add(deviceItem); 
       sqlRestore.Database = "firstRecoverTest"; 

       sqlRestore.SqlRestore(sqlServer); 

       //Add the recovered database into the Entity Table 
       SqlCommand intoEntity = new SqlCommand("IF NOT EXISTS(SELECT entityName FROM Entitys WHERE entityName = 'firstRecoveryTest') INSERT INTO Entitys VALUES ('firstRecoveryTest');", sqlConnection);     
       sqlConnection.Open(); 
       intoEntity.ExecuteNonQuery(); 

       Database db = default(Database); 
       db = sqlServer.Databases["firstRecoverTest"]; 
       db.RecoveryModel = (RecoveryModel)1; 
       db.AutoClose = true; 
       //db.Alter(); 

      } 

在这个例子中有一个db.Alter();函数,但会抛出一个错误,指出“Alter数据库失败”firstRecoverTest“”。

请让我知道你的想法提前

感谢

UPDATE

插入后 “ReplaceDatabase = TRUE;”最终结果没有变化。 也逐行逐行显示代码,表明它正在通过。

“db.Alter();”只是放在代码的末尾(显示为注释)。它用于创建备份并无误地工作。 InnerError在使用db.Alter()时显示此信息。

有趣的部分是SQL日志文件

“而数据库处于还原状态ALTER DATABASE是不允许的”。我得到3个日志:

“启动数据库”firstRecoverTest“。”

“数据库'firstRecoverTest'被标记为RESTORING并处于不允许恢复运行的状态。”数据库已恢复:数据库:firstRecoverTest,创建日期(时间):2011/09/20(15:44:48),第一个LSN:37:159:37,最后一个LSN:37:175:1,最后一个LSN为37:175:转储设备数量:1,设备信息:(FILE = 1,TYPE = DISK:{'C:\ Users \ Administrator \ Desktop \ installer_backup'})。信息性消息。无需用户操作。

然而,当我做一个正常的恢复使用SQL Management Studio中有2个对数entrys说

“启动数据库 '[的databaseName]'。”

“恢复完整数据库‘[的databaseName]’。该数据库现已”

我没有足够的声誉发布的它是如何在SQL Management Studio中不幸的小图像。

回答

4

您应该尝试删除数据库或使用sqlRestore.ReplaceDatabase = true;

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.replacedatabase.aspx

如果它看起来像什么都没发生,你可以在一个单独的线程及导线上通过使用这些为进步的变化通知的事件开始处理。

sqlRestore.Complete += new ServerMessageEventHandler(completionEvent); 
sqlRestore.PercentCompleteNotification = 10; // Call progress event every x percent change. 
sqlRestore.PercentComplete += new PercentCompleteEventHandler(progressEvent); 

如果不工作,你可以请张贴不工作的阿尔特代码。还要检查SQL服务器日志和权限。

修订

确定该更新更有意义。原因是因为你正在设置sqlRestore.NoRecovery = true;。这样做的结果是,恢复完成后,数据库将保持恢复状态,以便除了恢复完整以外,还可以恢复额外的差异备份。

虽然处于这种状态,您将无法对数据库做更多的事情。我会建议,除非你需要它,否则保留NoRecovery = false的默认值。

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.backuprestorebase.norecovery.aspx

希望有所帮助。

+0

我已更新我的帖子,希望能帮助解释发生了什么 – Seige

+0

@Seige请参阅更新。 –

+0

谢谢。 我以为我曾试图改变过去,但我一定有其他错误导致它失败。这解决了这个问题。 再次感谢您 – Seige