지난번에 데이터베이스 복원 및 복구와 관련된 프로젝트를 수행한 적이 있는데, 온라인에서 검색한 결과 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.Configuration
;
using
System.Data.SqlClient
;
<summary >
/// DbOper 클래스는 주로 SQLDMO를 사용하여 Microsoft SQL Server 데이터베이스의 백업 및 복구를 구현합니다
.
/// </summary>
public class DbOper
{
private
string server
private
string pwd;
string conn ;
/// <summary>
/// DbOper 클래스 생성자
/// </summary>
public DbOper(
)
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
( conn,"서버=",";");
pwd=cut(conn,"
pwd=",";")
; , "database=",";");
}
공개
문자열 컷(string str,string bg,string ed)
{
string
sub=str.Substring(str.IndexOf(bg)+bg.Length);
. Substring(0,sub.IndexOf(";")
)
;
/// <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();
}
}
}
}