专注于技术经验交流

水至清则无鱼、宁静而致远!

技术、经验、学习共同打造网络新生活!
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

页面中实现SQL数据库备份还原

Posted on 2006-10-13 15:35  小鱼儿  阅读(772)  评论(0编辑  收藏  举报

用SQLDMO可以实现对数据库的备份与恢复,下面给出简单的实现方法。
首先需要添加对SQLDMO引用
在工具箱处右击找到上面相应的值

1.实现数据库的备份:
 /**//// <summary>
        /// 数据库备份
         /// </summary>
         /// <returns>备份是否成功</returns>
        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);

                return true;
            }
            catch(Exception ex)
            {
                return false;
                throw ex;
            }
            finally
            {
                oSQLServer.DisConnect();
            }
        }
2.实现数据库恢复:
在恢复时要注意先杀掉当前数据库的所有进程
/**//// <summary>
        /// 数据库恢复
        /// </summary>
        public string DbRestore()
        {
            if(exepro()!=true)//执行存储过程
            {
                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 = @"d:\aaa\aaa.bak";
                    oRestore.FileNumber = 1;
                    oRestore.ReplaceDatabase = true;
                    oRestore.SQLRestore(oSQLServer);

                    return "ok";
               }
                catch(Exception e)
                {
                    return "恢复数据库失败";
                    throw e;
                }
                finally
                {
                    oSQLServer.DisConnect();
                }
            }
        }
       
        /**//// <summary>
        /// 杀死当前库的所有进程
        /// </summary>
        /// <returns></returns>
        private bool exepro()
        {

            SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
            SqlCommand cmd = new SqlCommand("killspid",conn1);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@dbname","aaa");
            try
            {
                conn1.Open();
                cmd.ExecuteNonQuery();
                return true;
}
            catch(Exception ex)
            {
                return false;
            }
            finally
            {
                conn1.Close();
            }
        }
完整的操作类如下:
  using System;
  using System.Collections;
  using System.Data;
  using System.Data.SqlClient;
 
  namespace DbBackUp
  {
     /**//// <summary>
     /// 创建人:Terrylee
    /// 创建时间:2005年8月1日
     /// 功能描述:实现数据库的备份和还原
     /// 更新记录:
     /// </summary>
     public class DbOperate
     {   
         /**//// <summary>
         /// 服务器
         /// </summary>
         private string server;
        
         /**//// <summary>
         /// 登录名
         /// </summary>
         private string uid;
       
        /**//// <summary>
         /// 登录密码
         /// </summary>
         private string pwd;
       
         /**//// <summary>
         /// 要操作的数据库
         /// </summary>
         private string database;
        
         /**//// <summary>
        /// 数据库连接字符串
         /// </summary>
         private string conn;
 
        /**//// <summary>
        /// DbOperate类的构造函数
        /// 在这里进行字符串的切割,获取服务器,登录名,密码,数据库
        /// </summary>
         public DbOperate()
        {
             conn = System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
             server = StringCut(conn,"server=",";");
             uid = StringCut(conn,"uid=",";");
            pwd = StringCut(conn,"pwd=",";");
             database = StringCut(conn,"database=",";");
         }
        
         /**//// <summary>
         /// 切割字符串
         /// </summary>
         /// <param name="str"></param>
         /// <param name="bg"></param>
         /// <param name="ed"></param>
         /// <returns></returns>
         public string StringCut(string str,string bg,string ed)
         {
             string sub;
             sub=str.Substring(str.IndexOf(bg)+bg.Length);
             sub=sub.Substring(0,sub.IndexOf(";"));
             return sub;
         }
        
         /**//// <summary>
         /// 构造文件名
         /// </summary>
         /// <returns>文件名</returns>
        private string CreatePath()
         {
             string CurrTime = System.DateTime.Now.ToString();
             CurrTime = CurrTime.Replace("-","");
             CurrTime = CurrTime.Replace(":","");
             CurrTime = CurrTime.Replace(" ","");
             CurrTime = CurrTime.Substring(0,12);
            string path = @"d:\\aaa\\";
             path += database;
            path += "_db_";
             path += CurrTime;
             path += ".BAK";
            return path;
         }
 
         /**//// <summary>
        /// 数据库备份
         /// </summary>
         /// <returns>备份是否成功</returns>
         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);

                return true;
            }
            catch(Exception ex)
            {
                return false;
                throw ex;
            }
           finally
           {
                oSQLServer.DisConnect();
            }
        }

        /**//// <summary>
        /// 数据库恢复
        /// </summary>
       public string DbRestore()
       {
            if(exepro()!=true)//执行存储过程
           {
               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 = @"d:\aaa\aaa.bak";
                    oRestore.FileNumber = 1;
                    oRestore.ReplaceDatabase = true;
                   oRestore.SQLRestore(oSQLServer);

                   return "ok";
                }
                catch(Exception e)
                {
                   return "恢复数据库失败";
                    throw e;
                }
                finally
                {
                  oSQLServer.DisConnect();
               }
            }
        }
       
        /**//// <summary>
        /// 杀死当前库的所有进程
        /// </summary>
        /// <returns></returns>
        private bool exepro()
        {

            SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
           SqlCommand cmd = new SqlCommand("killspid",conn1);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@dbname","aaa");
           try
            {
                conn1.Open();
                cmd.ExecuteNonQuery();
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
            finally
            {
                conn1.Close();
            }
        }

    }

}

在相应的按钮
1<asp:Button id="wbtn_Backup" runat="server" Width="60px" Text="备 份" CssClass="Button"></asp:Button>单击事件里调用即可:

/**//// <summary>
         /// 备份按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void wbtn_Backup_Click(object sender, System.EventArgs e)
        {
             DbOperate dbop = new DbOperate();
           dbop.DbBackup();
        }

存储过程建立
首先打开MASTER数据库

use  master

执行下面SQL语句
create proc    killspid    (@dbname    varchar(20))     
as     
begin     
declare    @sql    nvarchar(500)     
declare    @spid    int     
set    @sql='declare    getspid    cursor    for         
select    spid    from    sysprocesses    where    dbid=db_id('''+@dbname+''')'
exec    (@sql)
open    getspid
fetch    next    from    getspid    into    @spid
while    @@fetch_status    <    >-1
begin     
exec('kill '+@spid)
fetch    next    from    getspid    into    @spid
end     
close    getspid     
deallocate    getspid     
end
restore  database
create proc    killspid    (@dbname    varchar(20))     
as     
begin     
declare    @sql    nvarchar(500)     
declare    @spid    int     
set    @sql='declare    getspid    cursor    for         
select    spid    from    sysprocesses    where    dbid=db_id('''+@dbname+''')'
exec    (@sql)
open    getspid
fetch    next    from    getspid    into    @spid
while    @@fetch_status    <    >-1
begin     
exec('kill '+@spid)
fetch    next    from    getspid    into    @spid
end     
close    getspid     
deallocate    getspid     
end

 

New Document