网站首页 > 网络编程教程 > ASP.NET教程 > 用asp.net还原与恢复sqlserver数据库

用asp.net还原与恢复sqlserver数据库

  • 作者:互联网
  • 时间:2009-06-30 15:30:57

    上次做了个项目,涉及到数据库的还原和恢复,到网上找了一下,是利用SQLDMO实现的,只要添加SQLDMO引用就好了,然后利用下边的类的方法就可以实现了。

我把原作者的类扩充了一下,可以自动识别we***onfig里 的数据库连接字符串,可以通过变量设置还原恢复的信息。

需要注意的时还原,还原的时候问题最大了,有别的用户使用数据库的时候无法还原,解决办法就是在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,就是你的数据库的名字。下边是类的原代码:(we***onfig里的数据库连接字符串是constr)
 

using System;

using Sy***m.Configuration;

using Sy***m.Data.SqlClient;

using Sy***m.Data;

namespace we***ase_class

{

     ///

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

     ///

     public class DbOper

     {

          private string server;

          private string uid;

          private string pwd;

          private string database;

          private string conn;

         ///

         /// DbOper类的构造函数

         ///

         public DbOper()

         {

              conn=Sy***m.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;

              su***tr.Substring(st***ndexOf(bg)+bg***ngth);

              su***ub.Substring(0,su***ndexOf(";"));

              return sub;

         }

 

         ///

         /// 数据库备份

         ///

         public  bool DbBackup(string url)

         {

              SQ***O.Backup oBackup = new SQ***O.BackupClass();

              SQ***O.SQLServer oSQLServer = new SQ***O.SQLServerClass();

              try

              {

                   oS***erver.LoginSecure = false;

                   oS***erver.Connect(server,uid, pwd);

                   oB***up.Action = SQ***O.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;

                   oB***up.Database = database;

                   oB***up.Files = url;//"d:No***wind.bak";

                   oB***up.BackupSetName = database;

                   oB***up.BackupSetDescription = "数据库备份";

                   oB***up.Initialize = true;

                   oB***up.SQLBackup(oSQLServer);

                   return true;

              }

              catch

              {

                   return false;

                   throw;

              }

              finally

              {

                   oS***erver.DisConnect();

              }

         }

 

         ///

         /// 数据库恢复

         ///

         public string DbRestore(string url)

         {

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

              {

                   return "操作失败";

              }

              else

              {

                   SQ***O.Restore oRestore = new SQ***O.RestoreClass();

                   SQ***O.SQLServer oSQLServer = new SQ***O.SQLServerClass();

                   try

                   {

                        oS***erver.LoginSecure = false;

                        oS***erver.Connect(server, uid, pwd);

                        oR***ore.Action = SQ***O.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;

                        oR***ore.Database = database;

                        oR***ore.Files = url;//@"d:No***wind.bak";

                        oR***ore.FileNumber = 1;

                        oR***ore.ReplaceDatabase = true;

                        oR***ore.SQLRestore(oSQLServer);

                       return "ok";

                   }

                   catch(Exception e)

                   {

                       return "恢复数据库失败";

                       throw;

                   }

                   finally

                   {

                        oS***erver.DisConnect();

                   }

              }

         }

          private bool exepro()

         {

              SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");

              SqlCommand cmd = new SqlCommand("killspid",conn1);

              cm***ommandType = Co***ndType.StoredProcedure;

              cm***arameters.Add("@dbname","port");

              try

              {

                   co***.Open();

                   cm***xecuteNonQuery();

                   return true;

              }

              catch(Exception ex)

              {

                   return false;

              }

              finally

              {

                   co***.Close();

              }

 

         }

     }

}