SQL Server SMO备份数据库进度条不显示的原因


  本文标签:SQL Server SMO备份数据库

  我们今天主要向大家描述的是SQL Server SMO备份数据库进度条不显示这一问题,假如你在实际操作中遇到相似的情况,但是你却不知道对其如何正确的解决,那么以下的文章对你而言一定是良师益友  。

  一个奇怪的问题,用SQL Server  SMO备份数据库时不显示进度条,也就是进度条事件PercentComplete不触发  。 今天试了一下,果然有点奇怪  。

  代码如下:
 

  

  1. using Microsoft.SqlServer.Management.Smo;  
  2. using Microsoft.SqlServer.Management.Common;  
  3. private void btnBackup_Click(object sender, EventArgs e)  
  4. {  
  5. btnBackup.Enabled = false;  
  6. Thread tr = new Thread(new ThreadStart(doBackup));  
  7. tr.Priority = ThreadPriority.AboveNormal;  
  8. tr.Start();  
  9. //Thread.Sleep(3000);  
  10. }  
  11. /// <summary> 
  12.  

  备份数据库

  1. /// summary> 
  2. public void doBackup()  
  3. {  
  4. pbDemo.Value = 0;  
  5. pbDemo.Maximum = 100;  
  6. pbDemo.Style = ProgressBarStyle.Blocks;  
  7. //pbDemo.Step = 10;  
  8. Server srv = new Server(@"(local)");  
  9. Backup backup = new Backup();  
  10. backup.Action = BackupActionType.Database;  
  11. backup.Database = "btnet";  
  12. backup.Incremental = false;  
  13. backup.Devices.Add(new BackupDeviceItem(@"C:\agronet09.bak", DeviceType.File));  
  14. backup.Initialize = true;  
  15. backup.PercentCompleteNotification = 10;  
  16. backup.PercentComplete += new PercentCompleteEventHandler(backup_PercentComplete);  
  17. //backup.Checksum = true;  
  18. backup.SqlBackup(srv);  
  19. }  
  20. public void backup_PercentComplete(object sender, Microsoft.SqlServer.Management.Smo.PercentCompleteEventArgs e)  
  21. {  
  22. this.Invoke(new displayProgress_delegate(displayProgress), e.Percent);  
  23. //Application.DoEvents();  
  24. }  
  25. public delegate void displayProgress_delegate(int progress);  
  26. public void displayProgress(int progress)  
  27. {  
  28. this.lbProgress.Text = "已完成[" + progress.ToString() + " %]";  
  29. pbDemo.Value = progress;  
  30. btnBackup.Enabled = (progress == 100);  
  31. }  

  症状如下:结果正确执行,但进度条不显示  。
 

  刚开始以为是线程问题,后来发现不是这个原因  。

  又试了另外一段代码
 

  

  1. using Microsoft.SqlServer.Management.Smo;  
  2. using Microsoft.SqlServer.Management.Common;  
  3. using System.Diagnostics;  
  4. static void Main(string[] args)  
  5. {  
  6. BackupDatabase("ap4\\agronet09", "agronet2008", "c:\\Northind_3.bak");  
  7. Console.WriteLine(Environment.NewLine + "Press any key to continue.");  
  8. Console.ReadKey();  
  9. }  
  10. public static void BackupDatabase(string serverName, string databaseName, string fileName)  
  11. {  
  12. Console.WriteLine("*** Backing up ***");  
  13. Server server = new Server(serverName);  
  14. Backup backup = new Backup();  
  15. backup.Action = BackupActionType.Database;  
  16. backup.Database = databaseName;  
  17. backup.Incremental = false;  
  18. backup.Initialize = true;  
  19. backup.LogTruncation = BackupTruncateLogType.Truncate;  
  20. BackupDeviceItem backupItemDevice = new BackupDeviceItem(fileName, DeviceType.File);  
  21. backup.Devices.Add(backupItemDevice);  
  22. backup.PercentCompleteNotification = 10;  
  23. backup.PercentComplete += backup_PercentComplete;  
  24. backup.Complete +=backup_Complete;  
  25. backup.SqlBackup(server);  
  26. }  
  27. protected static void backup_PercentComplete(object sender, PercentCompleteEventArgs e)  
  28. {  
  29. Console.WriteLine(e.Percent + "% processed.");  
  30. //Application.();  
  31. System.Threading.Thread.Sleep(1000);  
  32. }  
  33. protected static void backup_Complete(object sender, ServerMessageEventArgs e)  
  34. {  
  35. Console.WriteLine(Environment.NewLine + e.ToString());  
  36. }  

  结果还是不显示  。

  后来突然想到会不会是文件太小,试了一个200M的数据文件,果然成功显示:

  

  
后来经反复实验,发现SQL server 2000约在数据文件加日志文件大于6M左右时显示进度条  。

  而Sql server 2008 r2大约在3M时显示进度条  。可能跟机器也有关系  。

以上的相关内容就是对SQL Server SMO备份数据库进度条不显示的介绍,望你能有所收获  。