using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.IO;
public partial class DatabaseBackup : System.Web.UI.Page
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["strcon"]);//建立数据连接
protected void Page_Load(object sender, EventArgs e)
{
}
protected void BtnBackup_Click(object sender, EventArgs e)
{
SqlCommand comm = new SqlCommand("DatabaseBackup",conn);//执行数据库备份
comm.CommandType = CommandType.StoredProcedure;
try
{
conn.Open();
comm.ExecuteNonQuery();
TransportFile();//传送备份文件
DelOldBackupFile();//删除过期备份文件
}
catch (SqlException ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
public void TransportFile()//将备份的文件传送到本机
{
System.IO.Stream iStream = null;
//以10K为单位缓存:
byte[] buffer = new Byte[10000];
int length;
long dataToRead;
// 制定文件路径.
string datestr = System.DateTime.Now.Date.ToString("yyyyMMdd");//系统当前日期YYYY-MM-DD
//string formatdatestr = datestr.Substring(0,4) + datestr.Substring(5,2) + datestr.Substring(8,2);
string filepath = @"E:\study\DMS\File\"+datestr+"";
// 得到文件名.
string filename = System.IO.Path.GetFileName(filepath);
try
{
// 打开文件.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,System.IO.FileAccess.Read, System.IO.FileShare.Read);
// 得到文件大小:
dataToRead = iStream.Length;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename+"BAK");
while (dataToRead > 0)
{
//保证客户端连接
if (Response.IsClientConnected)
{
length = iStream.Read(buffer, 0, 10000);
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
//结束循环
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// 出错.
throw ex;
}
finally
{
if (iStream != null)
{
//关闭文件
iStream.Close();
}
}
}
public void DelOldBackupFile()//删除过期的备份文件
{
string datestrNow = System.DateTime.Now.Date.ToString();//系统当前日期YYYY-MM-DD
DateTime dt = DateTime.Parse(datestrNow);//转换为Datetime
DateTime dateadd = dt.AddDays(-30);//当前日期减去30天
string datestr = dateadd.ToString("yyyyMMdd");//转换为字符串
string FileName = "~//File//" + datestr;
if (File.Exists(Server.MapPath(FileName)))
{
System.IO.File.Delete(Server.MapPath(FileName));//如果存在30天备份责删除
}
else
{
return;
}
}
}
如下是备份数据库应储存过程
CREATE PROCEDURE [dbo].[DatabaseBackup] AS
declare @DBName varchar(10)--当前数据库名称
declare @FileName varchar(100)--取当前的日期为保存文件名
declare @FilePath varchar(100)--保存文件路径
--declare @DelFileName varchar(100)--删除当前日期前30天文件
declare @DelFilePath varchar(100)--删除文件路径
set @DBName=(select db_name() as databasename)--查询当前数据库名称
set @FileName=(convert(varchar(100),getdate(),112))--当前日期为文件名
set @FilePath= 'E:\study\DMS\File\'+@FileName
--set @DelFileName=(convert(varchar(100),dateadd(day,-30,getdate()),112))--取得文件名
--set @DelFilePath ='E:\study\DMS\File\'+@DelFileName--删除文件路径
backup database @DBName to disk =@FilePath--保存数据库备份文件到相应路径
GO
对于此存储过程,如果重复执行在一个备份文档中会包含几个不同版本的备份文件,在恢复的时候需要选择时间点.
另传送备份文件到客户端,采用转换为Stream,避免了传送大文件造成的时间长甚至停止响应的情况。
对于恢复操作,可以选择本机备份的文件上传服务器,在恢复服务器数据库之前先备份系统当前数据,具体解决步骤差不多,有时间测试一下。
望各位给出自己的解决方案,是否还有更有效的解决办法。