上次做了个项目,涉及到数据库的还原和恢复,到网上找了一下,是利用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(,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 = ;

                        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();

              }

         }

     }

} 

用asp.net还原与恢复sqlserver数据库的更多相关文章

  1. 命令行下从bak文件恢复sqlserver数据库方法

    命令行下从bak文件恢复sqlserver数据库方法 注:本文所示访问从SqlServer 2000 - 2014版都是通用的 参考:http://blog.sina.com.cn/s/blog_5c ...

  2. ASP.NET+d3.js实现Sqlserver数据库的可视化展示

    效果: 数据库端: 前端展示: 实现原理: 1.在数据段建立两个存储过程 queryUserAnsawer(id) 根据用户ID返回每一题的得分,主要是bcp exe时不能直接在sqlserver中执 ...

  3. 备份/恢复SQLSERVER数据库,SQL一步实现

      --备份SQL SERVER数据库 BACKUP DATABASE book09 TO DISK ='c:\abc.bak' WITH init --恢复SQL SERVER数据库USE MAST ...

  4. 还原数据库,恢复SQLSERVER登录名的问题

    还原SQLSERVER数据库,原来的数据库的于当前SQLSERVER同名用户就不能再登录了,原因是当前SQLSERVERD的master数据库的sysxlogins表的的sid与还原后的数据库的sys ...

  5. RESTORE DATABASE命令还原SQLServer 数据库 bak

    今天在sqlServer20005 的management studio里使用bak文件还原数据库的时候,总是失败!Restore failed for Server 'ADANDELI'.  (Mi ...

  6. Sqlserver 数据库恢复常见错误及解决(网站转载 留着备用)

    数据库恢复常见错误及解决 2009-04-13 11:25 1145人阅读 评论(0) 收藏 举报 数据库databasesqlserverusermicrosoftsql server 在sqlSe ...

  7. 如何用Dummy实例执行数据库的还原和恢复

    今天实验了一下,如何在所有文件,包括数据文件,在线日志文件,控制文件都丢失的情况下,利用RMAN备份恢复和还原数据库.该实验的重点是用到了Dummy实例. 具体步骤如下: 备份数据库 [oracle@ ...

  8. asp.net 连接sqlserver数据库

    在asp.net中连接sqlserver数据库之前,首先得确保正常安装了sqlserver2008,同时有数据库. 在项目中添加一个类DB,用来专门负责执行对数据库的增删改查.在添加的过程中会弹出下面 ...

  9. 批处理(bat)实现SQLServer数据库备份与还原

    原文:批处理(bat)实现SQLServer数据库备份与还原 备份数据库.bat @echo off set path=%path%;C:\Program Files (x86)\Microsoft ...

随机推荐

  1. Laravel 之父:让 Laravel、Symfony、 Zend 来一场公平的性能测试

    网上充斥着各式各样的 PHP 框架性能对比的文章.然而,他们总是把“苹果”和“橘子”做对比(看上去有点儿像,都是圆的,但其实不是一码事).这次,我将着重对 Laravel.Symfony 和 Zend ...

  2. 洛谷——P2393 yyy loves Maths II

    P2393 yyy loves Maths II 题目背景 上次蒟蒻redbag可把yyy气坏了,yyy说他只是小学生,蒟蒻redbag这次不坑他了. 题目描述 redbag给了yyy很多个数,要yy ...

  3. Opencv学习笔记1:安装opencv和VS2015并进行环境配置

    用了Opencv一段时间了,简单记录一下opencv在vs2015下的配置. 第一部分:OpenCV3.2.0的下载 OpenCV官方下载地址: https://opencv.org/releases ...

  4. 「CTSC2016」单调上升路径

    「CTSC2016」单调上升路径 解题思路:根据提示可以得到答案的下界是 \(n - 1\) ,然后打表发现这个下界好像一定可以取到. 事实上考虑 \(n\) 个点完全图的边数是 \(\frac{n( ...

  5. 【二项式定理】【DFS】UVALive - 7639 - Extreme XOR Sum

    题意:一个序列,q次询问,每次问你某个指定区间内的EXtreme XOR值. 一个长度为l的区间的EXtreme XOR值被定义为,从左到右,将每相邻的两个数XOR起来,产生l-1个新的值,……如此循 ...

  6. 如何解决The underlying provider failed on Open问题

    转自codeproject,找了半天解决办法,这个最靠谱. 我数据库用的EF做ORM,在vs里面测试的时候不会出现这个错误,用IIS就出错了.解决方法如下 Solution for "The ...

  7. JSONObject 和 JSONArray 的区别和用法

    JSONObject 和 JSONArray 的数据表现形式不同: JSONObject的数据是用 {  } 来表示的,例如: { "id" : "1", &q ...

  8. Java字符串池

    1. String类的两个构造方法 private final char value[]; private int hash; public String() { this.value = " ...

  9. 新手必须掌握的Linux命令(上)

    1.1强大好用的Shell    通常来讲,计算机硬件是有运算器,控制器,存储器,输入/ 输出设备等共同组成的,而让各种硬件设备各司其职且又能协同运行的东西就是系统内核.Linux系统的内核负责完成对 ...

  10. csv文件导入到mysql

    如何将csv文件导入到mysql数据库呢,方法有很多但最简单粗暴的方法还是用sql语句啦,像下面这样. LOAD DATA LOCAL INFILE 'csv文件路径' INTO TABLE 数据表名 ...