2012-09-27 157 views
1

我試圖做一個Windows窗體應用程序,就可以備份和恢復從SQL Server數據庫。用戶可以選擇保存.bak文件的位置。我有C#:備份SQL Server數據庫到一個新的.bak文件

問題是,如果該文件不存在,它不會創建一個新的。因此,如果我從SQL Server內部進行備份並將其保存到C:\ backup.bak並將其作爲「路徑」傳遞到程序中,但是如果我將該文件的位置或名稱更改爲不存在它會拋出一個錯誤,說它無法打開備份設備。如果它不存在,是否可以創建一個新的.bak文件,我該如何去做?

我的代碼當前如下;

  var dataSource = txtDS.Text; 
      var db = txtDbName.Text; 
      var path = txtBackup.Text; 
      var name = txtName.Text; 
      var desc = txtDesc.Text; 

      if(File.Exists(path) == true) 
      { 
       MessageBox.Show("Test"); 
      } 
      else 
      { 

       Directory.CreateDirectory(@path); 
      } 

      Server myServer = new Server(dataSource); 
      myServer.ConnectionContext.LoginSecure = true; 
      myServer.ConnectionContext.Connect(); 

      var bkpDbLog = new Backup(); 
      bkpDbLog.Action = BackupActionType.Database; 
      bkpDbLog.Database = db; 

      bkpDbLog.Devices.AddDevice(path, DeviceType.File); 
      bkpDbLog.BackupSetName = name; 
      bkpDbLog.BackupSetDescription = desc; 

      bkpDbLog.Initialize = true; 
      bkpDbLog.Checksum = true; 
      bkpDbLog.ContinueAfterError = true; 
      bkpDbLog.Incremental = false; 
      bkpDbLog.FormatMedia = false; 

      bkpDbLog.PercentComplete += CompletionStatusInPercent; 

      bkpDbLog.Complete += BackupCompleted; 

      bkpDbLog.SqlBackup(myServer); 

      if (myServer.ConnectionContext.IsOpen) 
       myServer.ConnectionContext.Disconnect(); 

謝謝!

+0

我試圖直接保存到C:\,但它仍然拋出一個錯誤。 我遵循本指南http://technico.qnownow.com/backup-and-restore-sql-server-database-programmatically-in-c/ 截圖http://i.imgur.com/jUqSb.jpg – chickenbeef

+0

謝謝!這工作,這是權限。愚蠢的錯誤:) – chickenbeef

+0

當然,爲什麼不。再次感謝。 – chickenbeef

回答

1

我不熟悉您在此處使用的Backup對象(我總是發出實際的BACKUP DATABASE命令),但是我懷疑如果文件不存在則會得到不同的錯誤,如果該文件夾不存在與vs如果你沒有寫入文件夾的權限。

文件是否存在以及您是否指定了.Initialize(相當於WITH INIT)將決定命令在這種情況下的行爲方式。

如果該文件夾不存在,你會得到一個錯誤,你需要首先創建的文件夾(當然,整個路徑,真的)。

如果文件夾確實存在,則需要確保SQL Server服務帳戶有權寫入該文件夾。您試圖寫入根目錄(C:\) - 驅動器根目錄在現代版本的Windows中是特殊的,受保護的聖地。嘗試創建一個文件夾,如C:\backups\並備份到該位置。

這是怎麼樣的,爲什麼我們通常允許SQL Server寫入該實例的指定備份文件夾,或其他一些預先確定的位置 - 然後移動/文件複製從那裏,如果我們需要它在其他地方。我們通常不希望管理用戶可能輸入的任何文件夾的權限。

相關問題