| 用户组 : 士兵 |
| 等级 : 版主 |
自封 : 无 |
| 发帖 : 17 |
| 积分 : 39 |
| 金钱 : 39 |
| 威望 : 12 |
| 注册 : 2007-6-20 11:47 |
|
|
第
1
楼
|
/// <copyright>青岛英网咨询技术有限公司 1999-2007</copyright>
/// <version>1.0</version>
/// <author>zhangl</author>
/// <email>zhangl@hrbanlv.com</email>
/// <log date="2007-08-06">创建</log>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SQLDMO;
using System.Configuration;
using System.Web;
using System.IO;
using Data;
using SQL;
using Business.Interface;
using Yingnet.Common;
namespace Business
{
/**//// <summary>
/// 创建人:zhangl
/// 创建时间:2007年08月06日
/// 功能描述:实现数据库的备份和还原
/// 更新记录:
/// </summary>
public class DbBackUpBN:BaseBusiness
{
public Data.DbBackUpDT detail = null;
#region 局部变量
/**/
/// <summary>
/// 服务器
/// </summary>
private string server;
/**//// <summary>
/// 登录名
/// </summary>
private string uid;
/**//// <summary>
/// 登录密码
/// </summary>
private string pwd;
/**//// <summary>
/// 要操作的数据库
/// </summary>
private string database;
#endregion
#region 构造函数
/**/
/// <summary>
/// DbBackUp类的构造函数
/// 在这里进行字符串的切割,获取服务器,登录名,密码,数据库
/// </summary>
public DbBackUpBN()
{
server=BaseConfManager.GetValue("DBServer");
database=BaseConfManager.GetValue("DBName");
uid=BaseConfManager.GetValue("DBUser");
pwd = BaseConfManager.GetValue("DBPwd");
}
#endregion
#region 数据库备份
/// <summary>
/// 构造文件名
/// </summary>
/// <returns>文件名</returns>
/// <author>zhangl</author>
private string CreatePath()
{
string CurrTime = System.DateTime.Now.ToString("yyyyMMddHHmmssff");
string strAbsolutePath =
HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath)
+ "\\DbBackUp" + "\\";
if (!Directory.Exists(strAbsolutePath))
{
Directory.CreateDirectory(strAbsolutePath);
}
string path = strAbsolutePath;
path += database;
path += "_db_";
path += CurrTime;
path += ".BAK";
return path;
}
/// <summary>
/// 数据库备份
/// </summary>
/// <returns>备份是否成功</returns>
/// <author>zhangl</author>
public bool DbBackup()
{
string path = CreatePath();
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = database;
oBackup.Files = path;
oBackup.BackupSetName = database;
oBackup.BackupSetDescription = "数据库备份";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
//写数据实体类zhanglei
detail = new Data.DbBackUpDT();
detail.ID = GetRand();
detail.DBName = path.Substring(path.LastIndexOf("\\")+1);
detail.BackDate = DateTime.Now.ToString();
detail.Description = "";
return true;
}
catch
{
return false;
}
finally
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// 生成随机的id
/// </summary>
/// <returns></returns>
/// <author>zhangl</author>
private string GetRand()
{
Random rnd = new Random();
return rnd.Next(10000).ToString();
}
/// <summary>
/// 备份数据库并写xml文件
/// </summary>
public void BackAndAdd()
{
if (!DbBackup())
{
HttpContext.Current.Response.Write("<script>alert('无法备份远程数据库,数据库备份失败!!')</script>");
}
else
{
XmlOperate operate = new XmlOperate(detail.ID,detail.DBName,detail.BackDate);
operate.DataFile =
HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath)
+ "\\DbBackUp" + "\\DbBackUpXML.xml";
if (operate.XmlWrite())
{
HttpContext.Current.Response.Write("<script>alert('数据库备份成功!!');
window.location='DbBackUp.aspx';</script>");
}
else
{
HttpContext.Current.Response.Write("<script>alert('写xml文件失败,导致数据库备份失败!!')</script>");
}
}
}
#endregion
#region 数据库还原
/// <summary>
/// 数据库恢复
/// </summary>
/// <author>zhangl</author>
public string DbRestore(string dbname)
{
if (dbname.Equals("initial database")) //判断是不是初始的数据
{
HttpContext.Current.Response.Write("<script>alert('数据库初始化数据,无法还原!!');</script>");
return "";
}
if(exepro()!=true)//执行存储过程
{
//return "操作失败";
HttpContext.Current.Response.Write("<script>alert('操作失败!!');</script>");
return "";
}
else
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
exepro();
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server, uid, pwd);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = database;
oRestore.Files =
HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath)+"\\DbBackUp"+"\\"+dbname;
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
HttpContext.Current.Response.Write("<script>alert('数据库还原成功!!');</script>");
return "ok";
}
catch
{
HttpContext.Current.Response.Write("<script>alert('数据库还原失败!!');</script>");
return "恢复数据库失败";
//throw (new Exception("恢复数据库失败"+e.Message)) ;
}
finally
{
oSQLServer.DisConnect();
}
}
}
#endregion
#region 杀死当前库的所有进程
/// <summary>
/// 杀死当前库的所有进程
/// </summary>
/// <returns></returns>
/// <author>zhangl</author>
private bool exepro()
{
SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
try
{
svr.Connect(server, uid, pwd);
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() == database.ToUpper()) //判断从进程中得到的列表名中是否存在和此数据库进程同名的
svr.KillProcess(lPID);
}
return true;
}
catch
{
return false;
}
}
#endregion
#region 对存储备份数据库信息的表的操作(转成xml来存储后以下方法都没有用到)
/// <summary>
/// 返回为DataTable的数据集
/// </summary>
/// <returns></returns>
/// <author>zhangl</author>
public DataTable GetDbBakList()
{
DbBackUpSQL sql = new DbBackUpSQL();
SqlInfo info = sql.GetBakList();
DataTable dt = this.ExecuteForDataTable(info);
return dt;
}
/// <summary>
/// 使用泛型读取数据列表(强类型)
/// </summary>
/// <returns></returns>
/// <author>zhangl</author>
public IList<Data.DbBackUpDT> GetDbBakIList()
{
DbBackUpSQL sql = new DbBackUpSQL();
return sql.GetBakIList();
}
/// <summary>
/// 通过主键id 得到一行数据
/// </summary>
/// <param name="detail"></param>
/// <returns></returns>
public SqlDataReader GetSingle(DbBackUpDT detail)
{
DbBackUpSQL sql = new DbBackUpSQL();
SqlInfo info = sql.GetSingle(detail);
SqlDataReader dr= (SqlDataReader)this.ExecuteForDataReader(info);
return dr;
}
/// <summary>
/// 删除一条记录
/// </summary>
/// <param name="detail"></param>
public void DeleteSingle(DbBackUpDT detail)
{
DbBackUpSQL sql = new DbBackUpSQL();
SqlInfo info = sql.Delete(detail);
this.Execute(info);
}
#endregion
}
}
|
|