Asp.net在程序中实现数据库的备份
为了保证用户数据的安全性,避免计算机在操作过程中出现意外,以及种种原因而引发的数据的丢失,应对数据库及时进行备份。以便日后能够对相关数据进行恢复,减少由于意外而造成的损失。 1.方案分析
备份主要是对SQL Server数据库或事务日志进行拷贝,数据库备份记录了在进行备份这一操作时数据库中所有数据的状态。在SQL Server中提供了BACKUP DATABASE语句用于实现备份数据库。数据库的备份主要是对数据库的完全备份,包括所有的数据以及数据库对象。
说明:由于是对数据库的完全备份,所以这种备份类型不仅速度较慢,而且将占用大量磁盘空间,正因为如此,在进行数据库备份时常将其安排在晚间,因为此时整个数据库系统几乎不进行其他事务操作,从而可以提高数据库备份的速度。
在对数据库进行完全备份时,所有未完成的事务或者发生在备份过程中的事务,都不会被备份。通常情况下,可以一边进行备份一边进行其他操作,但是,在备份过程中不允许执行以下操作
l 创建或删除数据库文件。
l 创建索引。
l 执行非日志操作。
l 自动或手工缩小数据库或数据库文件大小。
如果以上各种操作正在进行当中且准备进行备份,则备份处理将被终止。如果在备份中打算执行以上任何操作,则操作失败,而备份继续进行。
本实例应用了两个技术要点:应用SQL存储过程查找企业管理器中所有数据库和bcp实用工具。
l 应用SQL存储过程查找企业管理器中所有数据库
为了使软件更加智能化,利用SQL中自带的存储过程查找管理器中所有数据表,并将数据填充到下拉列表框中,主要用到的存储过程是sp_helpdb。下面介绍sp_helpdb的语法结构和用法
sp_helpdb:报告有关指定数据库或所有数据库的信息。
语法:
sp_helpdb[[@dbname=]’name’]
参数:
[@dbname=]’name’:是要为其提供信息的数据库名称。Name的数据类型为sysname,无默认值。如果没有指定name,则sp_helpdb报告master.dbo.systdatabases中的所有数据库。
权限:执行默认授予public角色。
sp_helpdb必须访问服务器上的数据库以确定要显示的有关数据库的信息。因此,服务器上的每个数据库都必须满足下列条件之一。
2 执行sp_helpdb的用户必须拥有访问数据库的权限。
2 guest用户帐号必须处于数据库中。
如果无法访问数据库,那么sp_helpdb将显示错误信息15622和有关数据库信息。示例代码:
返回有关某一个数据库的信息。
Exec sp_helpdb pubs
返回所有数据库信息
Exec sp_helpdb
l bcp实用工具。
bcp实用工具用于SQL Server2000实例和数据文件之间指定的格式复制数据。以下介绍bcp实用工具中几个重要的参数说明。
2 In|out|queryout|format:指定大容量复制的方向。In是从文件复制到数据库表或视图,out是指从数据库表或视图复制到文件。
2 -c:使用字符数据类型执行大容量复制操作。
2 -q:在bcp实用工具和SQL Server实例的连接中执行SET QUOTED_IDENTIFLERSON语句。
2 -S server_name[/instance_name]:指定要连接到的SQL Server实例。
2 -U login_id:指定用于连接到的SQL Server实例。
2 -P password:指定登录ID的密码
以下代码为本实例即备份数据表实例中应用的代码。
cmdtxt2+="out"+this.txtPath.Text.Trim()+".xls-c-q-S.-Usa-P"+this.txtPwd.Text.Trim()+"'";
该语句主要应用了bcp实用工具中几个重要的参数,读者可根据以上内容的介绍来进一步理解上述代码的意义。 2.实施过程
实例主要应用BACKUP DATABASE语句备份数据库到指定磁盘的文件中。
具体实施过程:
(1)新建一个网站,将其命名为20,默认主页为Index.aspx。
(2)在Index.aspx页添加1个DropDownList控件,1个TextBox控件和1个Button控件,用于选择要备份的数据库、输入备份数据库的新名称和路径和执行备份操作。
(3)主要程序代码。
在Page_Load事件中,根据条件从数据库中检索出相应的数据,并将结果集中的数据填充到DropDownList中,代码如下。
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
stringcmdtxt1="Server=(local);DataBase=master;Uid=sa;Pwd=";
stringcmdtxt2="Execsp_helpdb";
SqlConnectionCon=newSqlConnection(cmdtxt1);
Con.Open();
SqlCommandmycommand=newSqlCommand(cmdtxt2,Con);
SqlDataReaderdr=mycommand.ExecuteReader();
this.dropSqlName.DataSource=dr;
this.dropSqlName.DataTextField="name";
this.dropSqlName.DataBind();
dr.Close();
Con.Close();
}
}
双击【备份数据库】按钮触发该按钮的Click事件,在该事件中执行数据库备份操作,代码如下。
protectedvoidbtnBackup_Click(objectsender,EventArgse)
{
stringcmdtxt1="Server=(local);database='"+this.
dropSqlName.SelectedValue+"';Uid=sa;Pwd=";
//定义备数据库的T-SQL命令的字符串
stringcmdtxt2="backupdatabase"+this.dropSqlName.SelectedValue+"todisk
='"+this.TextBox1.Text.Trim()+".bak'";
SqlConnectionCon=newSqlConnection(cmdtxt1);
Con.Open();
try
{
if(File.Exists(this.TextBox1.Text.Trim()))
{
Response.Write("<scriptlanguage=javascript>alert
('此文件已存在,请从新输入!');location='Index.aspx'</script>");
return;
}
SqlCommandCom=newSqlCommand(cmdtxt2,Con);
Com.ExecuteNonQuery();
Response.Write("<scriptlanguage=javascript>alert('备份数据成功!');location
='Index.aspx'</script>");
}
catch(Exceptionms)
{
Response.Write(ms.Message);
Response.Write("<scriptlanguage=javascript>alert('备份数据失败!')
</script>");
}
finally
{
Con.Close();
}
}
注意:此代码需要引用System.Data.SqlClient和System.IO命名空间