asp.Netバックアップリストアデータベース

4172 ワード

ネットで探してみると、SQLDMOで実現しているので、SQLDMOリファレンスを追加すればいいのですが、次のクラスの方法で実現できます.
私は原作者のクラスを拡張して、自動的にwebを識別することができます.configのデータベース接続文字列は、変数設定で復元された情報を復元できます.
注意が必要な場合はリストアし、リストア時に最も問題が発生し、他のユーザーがデータベースを使用している場合はリストアできません.解決策はMASTERデータベースにストレージ・プロシージャを追加することです.
create proc killspid (@dbnamevarchar(20))

as

begin

declare @sql nvarchar(500)

declare @spid int

set @sql='declare getspidcursor for 

select spid from sysprocesseswhere 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   MicrosoftSQL 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(stringstr,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(stringurl)

 

{

 

SQLDMO.Backup oBackup = newSQLDMO.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 stringDbRestore(string url)

 

{

 

if(exepro()!=true)//      

 

{

 

return "    ";

 

}

 

else

 

{

 

SQLDMO.Restore orestore = newSQLDMO.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 = newSqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");

 

SqlCommand cmd = newSqlCommand("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();

 

}

 

 

 

}

 

}

 

}

 
 
ソースドキュメント