今天心血来潮,也不知道受什么影响,突然想起做一个远程数据备份的程序,实现自动备份并用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 - 1, 1) != "\\")
{
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() + "%
";
}

}
}
下载程序源文件。

程序中用到了SqlDMO组件及FTP组件。
程序核心为自定的一个TabPage,作用是载入配置并执行备份。




































































































































































