一个sql备份工具

今天心血来潮,也不知道受什么影响,突然想起做一个远程数据备份的程序,实现自动备份并用ftp传回本地。


程序中用到了SqlDMO组件及FTP组件。
程序核心为自定的一个TabPage,作用是载入配置并执行备份。
using System;
using System.Windows.Forms;
using SQLDMO;
using System.Data;
using System.Threading;

namespace HLSoft.ServerBack
{
    
public class TabProcessPage : System.Windows.Forms.TabPage
    
{
        FaibClass.Windows.Forms.ListBox lstInfo;
        Thread thread; 
        FTP ftp;
        
private string name, service, sqldbname, sqldbuser, sqldbpwd, ftpport, ftpuser, ftppwd, ftpdir, localdir;

        
public TabProcessPage()
        
{
            lstInfo 
= new FaibClass.Windows.Forms.ListBox();
            lstInfo.Dock 
= DockStyle.Fill;
            lstInfo.DrawMode 
= DrawMode.OwnerDrawFixed;
            lstInfo.ItemHeight 
= 18;
            
base.Controls.Add(lstInfo);
            thread 
= new Thread(new ThreadStart(BeginBackup));
            thread.IsBackground 
= true;
        }


        
public TabProcessPage(DataTable dtbl) : this()
        
{
            DataRow drow 
= dtbl.Rows[0];
            
this.name = base.Text = dtbl.TableName;
            service 
= drow["Service"].ToString();
            sqldbname 
= drow["SqlDbName"].ToString();
            sqldbuser 
= drow["SqlDbUser"].ToString();
            sqldbpwd 
= Encrypt.DESDecrypt(drow["SqlDbPwd"].ToString(), "faib920");
            ftpport 
= drow["FtpPort"].ToString();
            ftpuser 
= drow["FtpUser"].ToString();
            ftppwd 
= Encrypt.DESDecrypt(drow["FtpPwd"].ToString(), "faib920");
            ftpdir 
= checkFilePath(drow["FtpDir"].ToString());
            localdir 
= checkFilePath(drow["LocalDir"].ToString());
        }


        
public void Start()
        
{
            
if(thread.ThreadState == ThreadState.Running)return;
            lstInfo.Items.Add(
"线程 " + name + " 已启动.");
            thread.Start();
        }


        
public void Abort()
        
{
            thread.Abort();
        }


        
private void BeginBackup()
        
{
            
string filename = "";
            filename 
= BackupSqlDatabase();
            
if(filename != "")
            
{
                lstInfo.Items.Add(
"---------------------------");
                DownloadFile(filename);
            }

        }


        
public string BackupSqlDatabase()
        
{
            
string filename = "";
            SQLServerClass sql 
=new SQLServerClass();
            
//连接
            try
            
{
                sql.LoginSecure 
= false;
                sql.Connect(service, sqldbuser, sqldbpwd);
                lstInfo.Items.Add(
"连接远程(" + service + ")SQLSERVER服务成功");
            }

            
catch (Exception exp)
            
{
                lstInfo.Items.Add(exp.Message);
            }

            
//备份
            try
            
{
                BackupClass bak 
= new BackupClass();
                bak.Database 
= sqldbname;
                bak.Action 
= SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
                bak.Initialize 
= true;
                filename 
= sqldbname + "_" + DateTime.Now.ToString("yyyyMMddHHmmss"+ ".sqlbak";
                bak.Files 
= ftpdir + filename;
                lstInfo.Items.Add(
"开始备份数据库(" + sqldbname + ")");
                lstInfo.Items.Add(
"备份进度 0%");
                bak.PercentComplete 
+= new BackupSink_PercentCompleteEventHandler(bak_PercentComplete);
                bak.SQLBackup(sql);
                lstInfo.Items.Add(
"数据库备份完成");
            }

            
catch (Exception exp)
            
{
                lstInfo.Items.Add(exp.Message);
                filename 
= "";
            }

            sql.DisConnect();
            lstInfo.Items.Add(
"断开远程SQLSERVER服务");
            
return filename;
        }


        
private string checkFilePath(string path)
        
{
            
if(path.Length == 0)throw new Exception("文件路径不正确");
            
if(path.Substring(path.Length - 11!= "\\")
            
{
                
return path += "\\";
            }

            
else
            
{
                
return path;
            }

        }


        
private bool DownloadFile(string filename)
        
{
            
bool ret = true;
            ftp 
= new FTP(service, ftpport == "" ? 21 : int.Parse(ftpport), ftpuser, ftppwd);
            
try
            
{
                
int perc =  0, oldperc = 0;

                lstInfo.Items.Add(
"连接远程FTP服务");
                ftp.OpenDownload(
"/" + filename, localdir + filename);
                lstInfo.Items.Add(
"下载进度 0%");
                
while(ftp.DoDownload() > 0
                
{
                    perc 
= (int)((ftp.BytesTotal * 100)  / ftp.FileSize); 
                    
if(perc != oldperc)
                        lstInfo.Items[lstInfo.Items.Count 
- 1].Text = "下载进度 " + perc.ToString() + "%";
                    oldperc 
= perc;
                }

                ftp.RemoveFile(
"/" + filename);
                lstInfo.Items.Add(
"断开远程FTP服务");
                ftp.Disconnect();
            }

            
catch (Exception exp)
            
{
                lstInfo.Items.Add(exp.Message);
                ret 
= false;
            }

            
return ret;
        }

        
        
private void bak_PercentComplete(string Message, int Percent)
        
{
            lstInfo.Items[lstInfo.Items.Count 
- 1].Text = "备份进度 " + Percent.ToString() + "%";
        }


    }

}

下载程序源文件。
原文地址:https://www.cnblogs.com/faib/p/1053188.html