zoukankan      html  css  js  c++  java
  • 用asp.net还原与恢复sqlserver数据库(转)

    利用SQLDMO实现的,只要添加SQLDMO引用就好了,然后利用下边的类的方法就可以实现了。
    我把原作者的类扩充了一下,可以自动识别web.config里 的数据库连接字符串,可以通过变量设置还原恢复的信息。

    需要注意的时还原,还原的时候问题最大了,有别的用户使用数据库的时候无法还原,解决办法就是在MASTER数据库中添加一个存储过程:


    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
    GO


    在还原之前先执行这个存储过程,需要传递dbname,就是你的数据库的名字。下边是类的原代码:(web.config里的数据库连接字符串是constr)
     

    using System;

    using System.Configuration;

    using System.Data.SqlClient;

    using System.Data;

    namespace web.base_class

    {

         
    /// <summary>

         
    /// DbOper类,主要应用SQLDMO实现对Microsoft SQL Server数据库的备份和恢复

         
    /// </summary>


         
    public class DbOper

         
    {

              
    private string server;

              
    private string uid;

              
    private string pwd;

              
    private string database;

              
    private string conn;

             
    /// <summary>

             
    /// DbOper类的构造函数

             
    /// </summary>


             
    public DbOper()

             
    {

                  conn
    =System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();

                  server
    =cut(conn,"server=",";");

                  uid
    =cut(conn,"uid=",";");

                  pwd
    =cut(conn,"pwd=",";");

                  database
    =cut(conn,"database=",";");

             }


             
    public string cut(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>


             
    public  bool DbBackup(string url)

             
    {

                  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 
    = url;//"d:\Northwind.bak";

                       oBackup.BackupSetName 
    = database;

                       oBackup.BackupSetDescription 
    = "数据库备份";

                       oBackup.Initialize 
    = true;

                       oBackup.SQLBackup(oSQLServer);

                       
    return true;

                  }


                  
    catch

                  
    {

                       
    return false;

                       
    throw;

                  }


                  
    finally

                  
    {

                       oSQLServer.DisConnect();

                  }


             }


     

             
    /// <summary>

             
    /// 数据库恢复

             
    /// </summary>


             
    public string DbRestore(string url)

             
    {

                  
    if(exepro()!=true)//执行存储过程

                  
    {

                       
    return "操作失败";

                  }


                  
    else

                  
    {

                       SQLDMO.Restore oRestore 
    = new SQLDMO.RestoreClass();

                       SQLDMO.SQLServer oSQLServer 
    = new SQLDMO.SQLServerClass();

                       
    try

                       
    {

                            oSQLServer.LoginSecure 
    = false;

                            oSQLServer.Connect(server, uid, pwd);

                            oRestore.Action 
    = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;

                            oRestore.Database 
    = database;

                            oRestore.Files 
    = url;//@"d:\Northwind.bak";

                            oRestore.FileNumber 
    = 1;

                            oRestore.ReplaceDatabase 
    = true;

                            oRestore.SQLRestore(oSQLServer);

                           
    return "ok";

                       }


                       
    catch(Exception e)

                       
    {

                           
    return "恢复数据库失败";

                           
    throw;

                       }


                       
    finally

                       
    {

                            oSQLServer.DisConnect();

                       }


                  }


             }


              
    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","port");

                  
    try

                  
    {

                       conn1.Open();

                       cmd.ExecuteNonQuery();

                       
    return true;

                  }


                  
    catch(Exception ex)

                  
    {

                       
    return false;

                  }


                  
    finally

                  
    {

                       conn1.Close();

                  }


     

             }


         }


    }


  • 相关阅读:
    阿里云应用开发
    [New Portal]Windows Azure Virtual Machine (7) 删除Virtual Machine
    Windows Azure Affinity Groups (2) 创建Windows Azure Affinity Groups 地缘组
    [New Portal]Windows Azure Virtual Machine (8) Virtual Machine高可用(上)
    [New Portal]Windows Azure Virtual Machine (6) 指定Virtual Machine存储账户
    [New Portal]Windows Azure Storage (13) 本地冗余存储 vs 地理冗余存储 (下)
    [New Portal]Windows Azure Virtual Machine (9) Virtual Machine高可用与自动负载均衡(下)
    树控件的整理
    很好用的数据恢复软件
    JS日历控件
  • 原文地址:https://www.cnblogs.com/ghd258/p/339458.html
Copyright © 2011-2022 走看看