2011-09-19 73 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