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 kelasnya: (string koneksi database di web.config adalah constr)
menggunakan Sistem;
menggunakan Sistem.Konfigurasi;
menggunakan Sistem.Data.SqlClient;
menggunakan Sistem.Data;
namespace web.base_class
{
/// <ringkasan>
/// Kelas DbOper, terutama menggunakan SQLDMO untuk mewujudkan pencadangan dan pemulihan database Microsoft SQL Server
/// </ringkasan>
DbOper kelas publik
{
server string pribadi;
uid string pribadi;
string pribadi pwd;
database string pribadi;
koneksi string pribadi;
/// <ringkasan>
/// Konstruktor kelas DbOper
/// </ringkasan>
DbOper publik()
{
conn=Sistem.Konfigurasi.ConfigurationSettings.AppSettings["constr"].ToString();
server=potong(sambungan,"server=","";");
uid=potong(sambungan,"uid=","";");
pwd=potong(sambungan,"pwd=",";");
database=potong(sambungan,"database=","";");
}
pemotongan string publik(string str,string bg,string ed)
{
sub string;
sub=str.Substring(str.IndexOf(bg)+bg.Panjang);
sub=sub.Substring(0,sub.IndexOf(";"));
kembali sub;
}
/// <ringkasan>
/// Cadangan basis data
/// </ringkasan>
bool publik DbBackup (url string)
{
SQLDMO.Backup oBackup = SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = SQLDMO.SQLServerClass();
mencoba
{
oSQLServer.LoginSecure = salah;
oSQLServer.Connect(server,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = basis data;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = basis data;
oBackup.BackupSetDescription = "Cadangan Basis Data";
oBackup.Inisialisasi = true;
oBackup.SQLBackup(oSQLServer);
kembali benar;
}
menangkap
{
kembali salah;
melemparkan;
}
Akhirnya
{
oSQLServer.DisConnect();
}
}
/// <ringkasan>
/// Pemulihan basis data
/// </ringkasan>
string publik DbRestore (string url)
{
if(exepro()!=true)//Jalankan prosedur tersimpan
{
kembalikan "Operasi gagal";
}
kalau tidak
{
SQLDMO.Restore oRestore = SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = SQLDMO.SQLServerClass();
mencoba
{
oSQLServer.LoginSecure = salah;
oSQLServer.Connect(server, uid, pwd);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = basis data;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = benar;
oRestore.SQLRestore(oSQLServer);
kembalikan "oke";
}
menangkap (Pengecualian e)
{
return "Gagal memulihkan database";
melemparkan;
}
Akhirnya
{
oSQLServer.DisConnect();
}
}
}
bool exepro pribadi()
{
SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",sambungan1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameter.Tambahkan("@namadb","port");
mencoba
{
samb1.Buka();
cmd.ExecuteNonQuery();
kembali benar;
}
menangkap (Pengecualian ex)
{
kembali salah;
}
Akhirnya
{
samb1.Tutup();
}
}
}
}