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

    到网上找了一下,是利用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();

                  }

     

             }

         }

    }

  • 相关阅读:
    codevs 2021 中庸之道
    bzoj 1227: [SDOI2009]虔诚的墓主人
    cogs 2620. [HEOI2012]朋友圈
    bzoj 3123: [Sdoi2013]森林(45分暴力)
    cogs 1685 魔法森林
    bzoj 1061: [Noi2008]志愿者招募
    poj 1743 Musical Theme
    bzoj 1001: [BeiJing2006]狼抓兔子
    bzoj 4006: [JLOI2015]管道连接
    hdu 5693 D Game
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1298787.html
Copyright © 2011-2022 走看看