2013-07-10 40 views
2

我想爲通過C#語句處理我的應用程序的數據庫創建備份。通過C#語句備份SQL Server數據庫

這是我的代碼:

SqlConnection con = new SqlConnection(Connection.GetConnection()); 
SqlCommand command = new SqlCommand(); 

command.CommandText = "backup database [Pharmacy Database]to disk ="+"'"+path +"'"; 
command.CommandType = CommandType.Text; 
command.Connection = con; 

con.Open(); 
command.ExecuteNonQuery(); 
con.Close(); 

,給我一個錯誤:

Cannot open backup device 'C:/Users/Abo Sala7/Desktop'.Operating system error 5 (failed to retrieve text for this error. Reason:15105).
BACKUP DATABASE is terminating abnormally.

+0

也許錯過了'WITH FORMAT'選項?指定一個完整的文件名,而不是一個目錄也很好。 – 2013-07-10 15:11:17

回答

2

也許問題是,你的SQL-服務的ServiceUser沒有寫入權限定義的文件夾 - 服務正在執行備份 - 因此,此用戶必須對目標文件夾具有所需的權限。 (錯誤5 ==訪問)

+0

所以我怎麼能給它權限@Cadburry –

+0

你可以授予目的地文件夾的權限(看看sql-service是哪個用戶配置的)(開始 - 運行 - services.msc - > SQL Server - >註冊「登錄「) 或將SQLService用戶更改爲」LocalSystem「 - 但要小心,這給了SQL服務器對您的機器的完全權限......我會以第一種方式提供前提.. – Cadburry

+0

提示:如果數據庫的備份需要」 「長 - 與您的代碼,你會遇到超時..和」command.ExecuteNonQuery();「會拋出一個異常...通過設置「command.CommandTimeout」爲適當的值來增加命令的超時時間 – Cadburry

0

我一直在使用下面的代碼備份,試試這個。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Data; 


     /// <summary> 
     /// Backups the data base. 
     /// </summary> 
     /// <param name="fileName">Name of the file.</param> 
     /// <returns></returns> 
     public bool BackupDataBase(string fileName) 
     { 
      if (string.IsNullOrEmpty(fileName)) 
       return false; 
      bool isDatabackedUp = true; 
      try 
      { 

       Backup sqlBackup = new Backup(); 

       sqlBackup.Action = BackupActionType.Database; 
       sqlBackup.BackupSetDescription = "ArchiveDataBase:" + 
               DateTime.Now.ToShortDateString(); 

       sqlBackup.BackupSetName = "Archive"; 


       BackupDeviceItem deviceItem = new BackupDeviceItem(fileName, DeviceType.File); 
       ServerConnection connection = new ServerConnection(this.BackupConnection); 
       DataConnection dataConnection = new DataConnection(); 

       Server sqlServer = new Server(dataConnection.ServerName); 
       Database db = sqlServer.Databases[dataConnection.DataBaseName]; 

       sqlBackup.Database = dataConnection.DataBaseName; 
       sqlBackup.Initialize = true; 
       sqlBackup.Checksum = true; 
       sqlBackup.ContinueAfterError = true; 

       sqlBackup.Devices.Add(deviceItem); 
       sqlBackup.Incremental = false; 

       sqlBackup.ExpirationDate = DateTime.Now.AddDays(3); 
       sqlBackup.LogTruncation = BackupTruncateLogType.Truncate; 

       sqlBackup.FormatMedia = false; 

       sqlBackup.SqlBackup(sqlServer); 

       return isDatabackedUp; 

      } 
      catch (Exception) 
      { 
       return false; 

      } 

     } 


    private SqlConnection BackupConnection 
    { 
     get 
     { 
      string backupConnectionString = string.Empty; 
      ConnectionStringSettings settings = 
       ConfigurationManager.ConnectionStrings["LibrarySystemBackUpConnection"]; 
      backupConnectionString = settings.ConnectionString; 

      SqlConnection backupDatabaseConnection = new SqlConnection(backupConnectionString); 
      return backupDatabaseConnection; 
     } 
    } 
+0

代碼U給我提供了頭文件中的錯誤 using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Common; –

+0

您是否添加了程序集引用? – Kurubaran

+0

sry引用了什麼 –

0

這是一個過程在C#。希望使用備份它有助於

public void BackupDatabase 
    (string BackUpLocation, string BackUpFileName, string DatabaseName, string      ServerName) 
    { 

    DatabaseName = "[" + DatabaseName + "]"; 

    string fileUNQ = DateTime.Now.Day.ToString() + "_" + DateTime.Now.Month.ToString() + "_" + DateTime.Now.Year.ToString() +"_"+ DateTime.Now.Hour.ToString()+ DateTime.Now .Minute .ToString() + "_" + DateTime .Now .Second .ToString() ; 

    BackUpFileName = BackUpFileName + fileUNQ + ".bak"; 
    string SQLBackUp = @"BACKUP DATABASE " + DatabaseName + " TO DISK = N'" + BackUpLocation + @"\" + BackUpFileName + @"'"; 

    string svr = "Server=" + ServerName + ";Database=master;Integrated Security=True"; 

    SqlConnection cnBk = new SqlConnection(svr); 
    SqlCommand cmdBkUp = new SqlCommand(SQLBackUp, cnBk); 

    try 
    { 
     cnBk.Open(); 
     cmdBkUp.ExecuteNonQuery(); 
     Label1.Text = "Done"; 
     Label2.Text = SQLBackUp + " ######## Server name " + ServerName + " Database " + DatabaseName + " successfully backed up to " + BackUpLocation + @"\" + BackUpFileName + "\n Back Up Date : " + DateTime.Now.ToString(); 
    } 

    catch (Exception ex) 
    { 
     Label1.Text = ex.ToString(); 
     Label2.Text = SQLBackUp + " ######## Server name " + ServerName + " Database " + DatabaseName + " successfully backed up to " + BackUpLocation + @"\" + BackUpFileName + "\n Back Up Date : " + DateTime.Now.ToString(); 
    } 

    finally 
    { 
     if (cnBk.State == ConnectionState.Open) 
     { 

      cnBk .Close(); 
     } 
    } 
} 
0
internal void CreateDbBackup() 
{ 
     using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myConStr"].ConnectionString)) 
     { 
      SqlCommand cmd = con.CreateCommand(); 
      cmd.CommandText = string.Format(@"BACKUP DATABASE [MyDatabase] TO DISK = N'{0}' WITH INIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT", UtilityClassGeneral.DbBackupPath); 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 

    internal void RestoreDbFromBackup() 
    { 
     using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myConStr"].ConnectionString)) 
     { 
      SqlCommand cmd = con.CreateCommand(); 

      con.Open(); 

      // Make sure to get exclusive access to DB to avoid any errors 
      cmd.CommandText = "USE MASTER ALTER DATABASE [MyDatabase] SET SINGLE_USER With ROLLBACK IMMEDIATE"; 
      cmd.ExecuteNonQuery(); 

      cmd.CommandText = string.Format(@"RESTORE DATABASE [MyDatabase] FROM DISK = N'{0}' WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY , REPLACE", UtilityClassGeneral.DbBackupPath); 
      cmd.ExecuteNonQuery(); 
     } 
}