지난번에 데이터베이스 복원 및 복구와 관련된 프로젝트를 수행한 적이 있는데, 온라인에서 검색한 결과 SQLDMO 참조를 추가한 후 다음 클래스의 메서드를 사용하면 됩니다.
web.config에서 데이터베이스 연결 문자열을 자동으로 인식하고 변수 설정을 통해 복구된 정보를 복원할 수 있도록 원저자의 클래스를 확장했습니다.
복원할 때 주의해야 할 점은 복원할 때 다른 사용자가 데이터베이스를 사용할 때 해결 방법은 MASTER 데이터베이스에 저장 프로시저를 추가하는 것입니다.
proc killspid 생성(@dbname varchar(20))
~처럼
시작하다
@sql nvarchar(500) 선언
@spid int 선언
set @sql='getpid 커서 선언
dbid=db_id( '''+@dbname+''')' 인 sysprocesses에서 spid를 선택합니다.
exec(@sql)
getpid를 열어라
getspid에서 @spid로 다음 항목을 가져옵니다.
@@fetch_status<>-1 동안
시작하다
exec('kill '+@spid )
getspid에서 @spid로 다음 항목을 가져옵니다.
끝
getpid 닫기
할당해제getpid
끝
가다
복원하기 전에 이 저장 프로시저를 실행하려면 데이터베이스 이름인 dbname을 전달해야 합니다. 다음은 클래스의 원본 코드입니다. (web.config의 데이터베이스 연결 문자열은 constr입니다.)
using System;
using System.Data.SqlClient
;
using System.data;
네임스페이스 web.base_class
{
/// <summary>
/// DbOper 클래스는 주로 Microsoft SQL Server의 백업 및 복구를 구현합니다. 데이터베이스
/// </summary>
public class DbOper
{
개인 문자열
uid;
개인 문자열
데이터베이스
;
/// <summary>
///
DbOper 클래스 생성자
요약>
공개 DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
server=cut(conn,"server=",";")
uid=cut(conn,"uid =",";");
pwd=cut(conn,"pwd=",";");
데이터베이스=cut(conn,"database=",";");
}
공개 문자열 컷(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.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
시도
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database
= url;//"d:Northwind.bak ";
oBackup.BackupSetName = 데이터베이스;
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.SQLServer
oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oRestore.Action
= SQLDMO.SQLDMO_RESTORE_TYPE .SQLDMORestore_Database
= 데이터베이스;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber
= 1
;
oRestore.SQLRestore(oSQLServer);
;
}
catch(Exception e)
{
return "데이터베이스 복원 실패";
}
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();
}
}
}
}