asp.net实现Ms sql数据库的备份与恢复

我们这里通过SQLDMO实现数据库的备份与恢复操作,首先添加SQLDMO的引用

实现数据库备份与恢复的操作类:

 

using  System;
using  System.Data;
using  System.Data.SqlClient;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

/// <summary>
/// dbDataBack 的摘要说明
/// 实现数据库的备份与恢复
/// </summary>

public   class  dbDataBack
{
    
/// <summary>
    
/// 服务器
    
/// </summary>

    private string server;
    
/// <summary>
    
/// 登录名
    
/// </summary>

    private string uid;
    
/// <summary>
    
/// 登录密码
    
/// </summary>

    private string pwd;
    
/// <summary>
    
/// 要操作的数据库
    
/// </summary>

    private string database;
    
/// <summary>
    
/// 数据库链接字符串
    
/// </summary>

    private string conn;

    
/// <summary>
    
/// dbDataBack类的构造函数
    
/// 在这里进行字符串的切割,获取服务器,登录名,密码,数据库
    
/// </summary>

    public dbDataBack()
    
{
        conn 
= ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
        server 
= StringCut(conn, "data Source=",";");
        uid 
= StringCut(conn, "user id=",";");
        pwd 
= StringCut(conn, "pwd="";");
        database 
= StringCut(conn, "database="";");
    }

    
/// <summary>
    
/// 字符串切割函数
    
/// </summary>
    
/// <param name="str"></param>
    
/// <param name="bg"></param>
    
/// <param name="ed"></param>
    
/// <returns></returns>

    public string StringCut(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>
    
/// <returns></returns>

    private string createpath()
    
{
        
string CurrTime = System.DateTime.Now.ToString();
        CurrTime 
= CurrTime.Replace("-""");
        CurrTime 
= CurrTime.Replace(":""");
        CurrTime 
= CurrTime.Replace(" """);
        CurrTime 
= CurrTime.Substring(012);
        
string path = @"F:/Norkeweb2.0/databack/";
        path 
+= database;
        path 
+= "_db_";
        path 
+= CurrTime;
        path 
+= ".bak";
        
return path;
    }

    
/// <summary>
    
/// 数据库备份
    
/// </summary>
    
/// <returns></returns>

    public bool dbbackup()
    
{
        
string path = createpath();
        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 
= path;
            oBackUp.BackupSetName 
= database;
            oBackUp.BackupSetDescription 
= "数据库备份";
            oBackUp.Initialize 
= true;
            oBackUp.SQLBackup(oSQLServer);
            
return true;
        }

        
catch (Exception ex)
        
{
            
return false;
            
throw ex;
        }

        
finally
        
{
            oSQLServer.DisConnect();
        }

    }

    
/// <summary>
    
/// 数据库恢复
    
/// </summary>
    
/// <returns></returns>

    public string dbrestore()
    

        
if(exepro()!=true)
        
{
            
return "操作失败!";
        }

        
else
        
{
            SQLDMO.Restore oRestore
=new SQLDMO.RestoreClass();
            SQLDMO.SQLServer oSQLServer
=new SQLDMO.SQLServerClass();
            
try
            
{
                exepro();
                oSQLServer.LoginSecure
=false;
                oSQLServer.Connect(server,uid,pwd);
                oRestore.Action
=SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                oRestore.Database
=database;
                oRestore.Files
=@"F:/Norkeweb2.0/databack/web.bak";  //数据库备份文件
                oRestore.FileNumber=1;
                oRestore.ReplaceDatabase
=true;
                oRestore.SQLRestore(oSQLServer);
                
return "ok";
            }

            
catch(Exception ex)
            
{
                
return "恢复数据库失败!";
                
throw ex;
            }

            
finally
            
{
                oSQLServer.DisConnect();
            }

        }

    }

    
/// <summary>
    
/// 杀死当前库的所有进程
    
/// </summary>
    
/// <returns></returns>

    private bool exepro()
    

        SqlConnection conn1
=new SqlConnection("server="+server+";user id="+uid+";pwd="+pwd+";database=master");
        SqlCommand cmd
=new SqlCommand("killspid",conn1);
        cmd.CommandType
=CommandType.StoredProcedure;
        cmd.Parameters.Add(
"@dbname","web");
        
try
        
{
            conn1.Open();
            cmd.ExecuteNonQuery();
            
return true;
        }

        
catch(Exception ex)
        
{
            
return false;
        }

        
finally
        
{
            conn1.Close();
        }

    }

}

 

对应的存储过程:

1.sql 2005下面的写法:

/*杀死指定数据库的所有进程的存储过程,该存储过程只能放到数据库master下面*/
ALTER PROCEDURE killspid 
    (
        @dbname varchar(
20 )
    )
AS
    declare @sql nvarchar(
500 )
    declare @spid 
int
    
set  @sql = ' declare getspid cursor for select spid from sysprocesses where dbid=db_id( ''' + @dbname + ''' ) '
    execute(@sql)
    open getspid fetch next from getspid into @spid 
    
while  @@fetch_status <>- 1   
    begin   
        execute(
' kill  ' + @spid)   
        fetch next from getspid into @spid  
    end 
    close getspid 
    deallocate getspid
    
return

2.sql2000下面的写法:

 

CREATE PROCEDURE 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 + ''' ) '  
EXECUTE (@sql) 
OPEN getspid FETCH NEXT FROM getspid INTO @spid 
WHILE @@fetch_status
<>- 1  
BEGIN   
    EXECUTE(
' kill  ' + @spid)   FETCH NEXT FROM getspid INTO @spid 
END 
CLOSE getspid 
DEALLOCATE getspid
END
GO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值