在ASP.NET页面中实现数据库备份和恢复功能
2024-07-10 13:05:52
供稿:网友
using system;
using sqldmo;
using system.drawing;
using system.collections;
using system.componentmodel;
using system.windows.forms;
using system.data;
namespace bakserve040907
{
/// <summary>
/// 数据库备份类说明
/// </summary>
public class bakserver
{
string servername; //数据服务器名称
string username; //用户名称
string password; //用户密码
string message; //消息提示
progressbar pbar; //状态条控件
public bakserver()
{
}
/// <summary>
/// 取得数据库服务器列表
/// </summary>
/// <returns>数据库服务器列表</returns>
public arraylist getserverlist()
{
arraylist alservers = new arraylist() ;
sqldmo.application sqlapp = new sqldmo.applicationclass() ;
try
{
sqldmo.namelist serverlist = sqlapp.listavailablesqlservers() ;
for(int i = 1;i<= serverlist.count;i++)
{
alservers.add(serverlist.item(i)) ;
}
}
catch(exception e)
{
// throw(new exception("取数据库服务器列表出错:"+e.message)) ;
message = "取数据库服务器列表出错:" +e.message;
}
finally
{
sqlapp.quit() ;
}
return alservers ;
}
/// <summary>
/// 错误消息处理
/// </summary>
/// <returns>消息信息</returns>
public string msg()
{
return message;
}
/// <summary>
/// 取得指定数据库列表
/// </summary>
/// <param name="strservername">服务器名称</param>
/// <param name="strusername">用户名称</param>
/// <param name="strpwd">用户密码</param>
/// <returns>数据库列表</returns>
public arraylist getdblist(string strservername,string strusername,string strpwd)
{
servername = strservername ;
username = strusername ;
password = strpwd ;
arraylist aldbs = new arraylist() ;
sqldmo.application sqlapp = new sqldmo.applicationclass() ;
sqldmo.sqlserver svr = new sqldmo.sqlserverclass() ;
try
{
svr.connect(servername,username,password) ;
foreach(sqldmo.database db in svr.databases)
{
if(db.name!=null)
aldbs.add(db.name) ;
}
}
catch(exception err)
{
// throw(new exception("连接数据库出错:"+e.message)) ;
message = "连接数据库出错:" +err.message;
}
finally
{
svr.disconnect() ;
sqlapp.quit() ;
}
return aldbs ;
}
//数据库的备份和实时进度显示代码:
/// <summary>
/// 数据库的备份和实时进度显示
/// </summary>
/// <param name="strdbname">数据库名称</param>
/// <param name="strfilename">备份文件名</param>
/// <param name="pgbmain">状态条控件名称</param>
/// <param name="strservername">服务器名称</param>
/// <param name="strusername">用户名称</param>
/// <param name="strpwd">密码</param>
/// <returns>备份成功返回true ,否则返回false</returns>
public bool backupdb(string strdbname,string strfilename, progressbar pgbmain,string strservername,string strusername,string strpwd)
{
servername = strservername ;
username = strusername ;
password = strpwd ;
pbar = pgbmain;
sqldmo.sqlserver svr = new sqldmo.sqlserverclass() ;
try
{
svr.connect(servername,username,password) ;
sqldmo.backup bak = new sqldmo.backupclass();
bak.action = 0 ;
bak.initialize = true ;
sqldmo.backupsink_percentcompleteeventhandler pceh = new sqldmo.backupsink_percentcompleteeventhandler(step);
bak.percentcomplete += pceh;
bak.files = strfilename;
bak.database = strdbname;
bak.sqlbackup(svr);
return true ;
}
catch(exception err)
{
// throw(new exception("备份数据库失败"+err.message)) ;
message = "备份数据库失败:" +err.message;
return false ;
}
finally
{
svr.disconnect() ;
}
}
/// <summary>
/// 显示进度条的当前进度
/// </summary>
/// <param name="message"></param>
/// <param name="percent"></param>
private void step(string message,int percent)
{
pbar.value = percent ;
}
// 其中,这两个语句实现了进度的实时显示:
// sqldmo.backupsink_percentcompleteeventhandler pceh = new sqldmo.backupsink_percentcompleteeventhandler(step);
// bak.percentcomplete += pceh;
// step就是上面private void step(string message,int percent) 的方法名称,它用来显示进度条的当前进度。
/// <summary>
/// 数据库的恢复和杀死进程
/// </summary>
/// <param name="strdbname">数据库名称</param>
/// <param name="strfilename">备份文件名</param>
/// <param name="pgbmain">状态条控件名称</param>
/// <param name="strservername">服务器名称</param>
/// <param name="strusername">用户名称</param>
/// <param name="strpwd">密码</param>
/// <returns>恢复成功返回true ,否则返回false</returns>
public bool restoredb(string strdbname,string strfilename, progressbar pgbmain,string strservername,string strusername,string strpwd )
{
pbar = pgbmain ;
sqldmo.sqlserver svr = new sqldmo.sqlserverclass() ;
try
{
servername = strservername ;
username = strusername ;
password = strpwd ;
svr.connect(servername,username,password) ;
sqldmo.queryresults qr = svr.enumprocesses(-1) ;
int icolpidnum = -1 ;
int icoldbname = -1 ;
for(int i=1;i<=qr.columns;i++)
{
string strname = qr.get_columnname(i) ;
if (strname.toupper().trim() == "spid")
{
icolpidnum = i ;
}
else if (strname.toupper().trim() == "dbname")
{
icoldbname = i ;
}
if (icolpidnum != -1 && icoldbname != -1)
break ;
}
for(int i=1;i<=qr.rows;i++)
{
int lpid = qr.getcolumnlong(i,icolpidnum) ;
string strdbname = qr.getcolumnstring(i,icoldbname) ;
if (strdbname.toupper() == strdbname.toupper())
svr.killprocess(lpid) ;
}
sqldmo.restore res = new sqldmo.restoreclass() ;
res.action = 0 ;
sqldmo.restoresink_percentcompleteeventhandler pceh = new sqldmo.restoresink_percentcompleteeventhandler(step);
res.percentcomplete += pceh;
res.files = strfilename ;
res.database = strdbname ;
res.replacedatabase = true ;
res.sqlrestore(svr) ;
return true ;
}
catch(exception err)
{
// throw(new exception("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.message)) ;
message = "恢复数据库失败,请关闭所有和该数据库连接的程序!" +err.message;
return false;
}
finally
{
svr.disconnect() ;
}
}
}
}
网站运营seo文章大全提供全面的站长运营经验及seo技术!