2017-02-12 114 views
0

我有这个代码来备份我的数据库使用C#。C#备份:服务器XXX备份失败

但我得到Backup Failed for Server ADMIN-PC错误消息。

我可以从SQL Server Management Studio运行备份,但从这里出于某种原因它给了我这个错误。

我该如何做这项工作?

private void btnBackup_Click(object sender, EventArgs e) 
    { 
     progressBar1.Value = 0; 

     try 
     { 
      Server dbServer = new Server(new ServerConnection(txtServer.Text, txtUserName.Text, txtPassword.Text)); 
      Backup dbBackup = new Backup() {Action = BackupActionType.Database, Database = txtDatabase.Text}; 
      dbBackup.Devices.AddDevice(@"C:\PDM.bak", DeviceType.File); 
      dbBackup.Initialize = true; 
      dbBackup.PercentComplete += DbBackup_PercentComplete; 
      dbBackup.PercentComplete += DbBackup_Complete; 
      dbBackup.SqlBackupAsync(dbServer); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Message ", MessageBoxButtons.OK, MessageBoxIcon.Error); 


     } 

    } 
    private void DbBackup_Complete(object sender, ServerMessageEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      label5.Invoke((MethodInvoker)delegate 
      { 
       lblStatus.Text = e.Error.Message; 
      }); 
     } 

    } 
    private void DbBackup_PercentComplete(object sender, PercentCompleteEventArgs e) 
    { 
     progressBar1.Invoke((MethodInvoker)delegate 
     { 
      progressBar1.Value = e.Percent; 
      progressBar1.Update(); 


     }); 
     label5.Text = $"{e.Percent}%"; 
    } 
} 
+1

检查你得到的异常是否有更多的细节 – NineBerry

回答

1

这是所有异常消息吗?只尝试没有进度条的备份工作,看看抛出了什么异常。没有全貌,这里的人无法帮到你。

你只需要使用这种方式进行备份?

这是我的代码备份数据库供您参考。

using (SqlConnection masterdbConn = new SqlConnection()) 
{ 
    masterdbConn.ConnectionString = localmasterConnectionString; 
    masterdbConn.Open(); 

     using (SqlCommand rollback_dbcomm = new SqlCommand()) 
     { 
      rollback_dbcomm.Connection = masterdbConn; 
      rollback_dbcomm.CommandText = "ALTER DATABASE mydbname SET MULTI_USER WITH ROLLBACK IMMEDIATE"; 

      rollback_dbcomm.ExecuteNonQuery(); 
     } 
     masterdbConn.Close(); 
} 

SqlConnection.ClearAllPools(); 

using (SqlConnection backupConn = new SqlConnection()) 
{ 
    backupConn.ConnectionString = localConnectionString; 
    backupConn.Open(); 

    using (SqlCommand backupcomm = backupConn.CreateCommand()) 
    { 
      backupcomm.CommandText = @"BACKUP DATABASE mydbname TO DISK='c:\mydbname.bak'"; 

      backupcomm.ExecuteNonQuery(); 
    } 
    backupConn.Close(); 
} 

ALTER DATABASE回滚立即命令完成所有数据库中的未完成的事务,让我们说“手离开从数据库中准备好备份。

而且你需要检查在ConnectionString中的角色和权限..

你能告诉在SQL Server Management Studio中的SQL语法备份?和连接字符串没有凭据(如密码)? 你能更详细地描述你的问题吗?

备份工作需求的深刻理解Sever的如何运作..

+0

内部异常的作品谢谢!但我怎样才能让进度条工作? – KAKA

+0

这很好。我已经在这个时候尝试过与SMO一起实施。而且我意识到我多年前也尝试过这种SMO方式,但由于DLL问题而放弃(失败),并改为上述答案的方式。完成备份需要很长时间吗?数据库大小有多大?如果它不需要很长时间并且不是很大的数据库,只需要确定progressBar就足够了,并且可以通过Nuget或Github找到许多progressBar解决方案。 –

+0

没有它非常快,数据库大小非常小,我想添加当前的数据和时间在备份文件名 – KAKA