2013-07-10 37 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(); 
     } 
}