Terakhir kali saya mengerjakan proyek yang melibatkan pemulihan dan pemulihan basis data, saya mencari secara online dan menemukan bahwa itu diimplementasikan menggunakan SQLDMO. Anda hanya perlu menambahkan referensi SQLDMO, dan kemudian menggunakan metode kelas berikut untuk mencapainya.
Saya memperluas kelas penulis asli sehingga dapat secara otomatis mengenali string koneksi database di web.config dan memulihkan informasi yang dipulihkan melalui pengaturan variabel.
Yang perlu Anda perhatikan saat melakukan restorasi. Masalah terbesar adalah saat melakukan restorasi. Ketika pengguna lain menggunakan database, solusinya adalah dengan menambahkan prosedur tersimpan di database MASTER:
buat proc killspid (@dbname varchar(20))
sebagai
mulai
deklarasikan @sql nvarchar(500)
nyatakan @spid int
set @sql='deklarasikan kursor getpid untuk
pilih spid dari sysprocesses di mana dbid=db_id( '''+@dbname+''')'
eksekutif(@sql)
buka getpid
ambil selanjutnya dari getpid ke @spid
sementara @@fetch_status<>-1
mulai
exec('bunuh '+@spid )
ambil selanjutnya dari getpid ke @spid
akhir
tutup getpid
dealokasigetpid
akhir
PERGI
Untuk menjalankan prosedur tersimpan ini sebelum memulihkan, Anda harus meneruskan dbname, yang merupakan nama database Anda.
Berikut
ini adalah kode asli dari kelas tersebut: (string koneksi database di web.config
adalah
constr
)
menggunakan
System
;
<ringkasan >
/// Kelas DbOper, terutama menggunakan SQLDMO untuk mengimplementasikan pencadangan dan pemulihan database Microsoft SQL Server
///
</ringkasan>
kelas publik DbOper
{
server
string pribadi
uid
;
string samb ;
/// <ringkasan>
/// Pembuat kelas DbOper
/// </ringkasan>
publicDbOper
()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
( samb,"server=",";");
uid=potong(sambungan,"
uid=",";
"); , "database=",";");
}
pemotongan string publik(string str,string
bg,string ed)
{
string sub;
sub=str.Substring(str.IndexOf(bg)+bg.Panjang);
.Substring(0,sub.IndexOf(";"));
kembalikan sub
;
/// <ringkasan>
/// Cadangan basis data
/// </ringkasan>
public bool DbBackup(string url)
{
SQLDMO.Backup oBackup = SQLDMO.BackupClass()
;
coba
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(
server,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database
;
";
oBackup.BackupSetName = basis data;
oBackup.BackupSetDescription = "Cadangan Basis Data";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
return true;
}
catch
{
return false;
throw;
}
akhirnya
{
oSQLServer.DisConnect();
}
}
/// <ringkasan>
/// Pemulihan basis data
/// </ringkasan>
public string DbRestore(string url)
{
if(exepro()!=true)//Jalankan prosedur tersimpan
{
return "Operasi gagal
}
else
{
SQLDMO.Restore oRestore = SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = SQLDMO.SQLServerClass() baru;
coba
{
oSQLServer.LoginSecure
= false
;
.SQLDMORestore_Database;
oRestore.Database = basis data;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase
= benar
; ;
}
catch(Pengecualian e)
{
return "Gagal memulihkan database";
}
akhirnya
{
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");
coba
{
conn1.Open();
cmd.ExecuteNonQuery();
return true;
}
catch(Exception ex)
{
return false;
}
akhirnya
{
conn1.Close();
}
}
}
}