지난번에 데이터베이스 복원 및 복구와 관련된 프로젝트를 수행한 적이 있는데, 온라인에서 검색한 결과 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입니다.)
시스템 사용;
System.Configuration 사용;
System.Data.SqlClient 사용;
System.Data 사용;
네임스페이스 web.base_class
{
/// <요약>
/// DbOper 클래스는 주로 SQLDMO를 사용하여 Microsoft SQL Server 데이터베이스의 백업 및 복구를 실현합니다.
/// </summary>
공개 클래스 DbOper
{
개인 문자열 서버;
개인 문자열 uid;
개인 문자열 비밀번호;
개인 문자열 데이터베이스;
개인 문자열 연결;
/// <요약>
/// DbOper 클래스의 생성자
/// </summary>
공개 DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
서버=컷(콘,"서버=",";");
uid=cut(conn,"uid=",";");
pwd=cut(conn,"pwd=",";");
데이터베이스=컷(콘,"데이터베이스=",";");
}
공개 문자열 자르기(문자열 str,문자열 bg,문자열 ed)
{
문자열 하위;
sub=str.Substring(str.IndexOf(bg)+bg.Length);
sub=sub.Substring(0,sub.IndexOf(";"));
하위 반환;
}
/// <요약>
/// 데이터베이스 백업
/// </summary>
공개 bool DbBackup(문자열 URL)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = 새로운 SQLDMO.SQLServerClass();
노력하다
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(서버,uid, 비밀번호);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = 데이터베이스;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = 데이터베이스;
oBackup.BackupSetDescription = "데이터베이스 백업";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
사실을 반환;
}
잡다
{
거짓을 반환;
던지다;
}
마지막으로
{
oSQLServer.DisConnect();
}
}
/// <요약>
/// 데이터베이스 복구
/// </summary>
공개 문자열 DbRestore(문자열 URL)
{
if(exepro()!=true)//저장 프로시저 실행
{
"작업 실패"를 반환합니다.
}
또 다른
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = 새 SQLDMO.SQLServerClass();
노력하다
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(서버, uid, 비밀번호);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = 데이터베이스;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
"확인"을 반환합니다.
}
잡기(예외e)
{
"데이터베이스 복원 실패"를 반환합니다.
던지다;
}
마지막으로
{
oSQLServer.DisConnect();
}
}
}
개인 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");
노력하다
{
conn1.Open();
cmd.ExecuteNonQuery();
사실을 반환;
}
catch(예외예외)
{
거짓을 반환;
}
마지막으로
{
conn1.Close();
}
}
}
}