用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();
 
              }
 
 
 
         }
 
     }
 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章