2012-09-27 113 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写入该实例的指定备份文件夹,或其他一些预先确定的位置 - 然后移动/文件复制从那里,如果我们需要它在其他地方。我们通常不希望管理用户可能输入的任何文件夹的权限。

相关问题