ครั้งล่าสุดที่ฉันทำงานในโครงการที่เกี่ยวข้องกับการกู้คืนและการกู้คืนฐานข้อมูล ฉันค้นหาทางออนไลน์และพบว่ามีการใช้งานโดยใช้ SQLDMO คุณเพียงแค่ต้องเพิ่มการอ้างอิง SQLDMO จากนั้นใช้วิธีการของคลาสต่อไปนี้เพื่อให้บรรลุผล
ฉันขยายคลาสของผู้เขียนต้นฉบับเพื่อให้สามารถจดจำสตริงการเชื่อมต่อฐานข้อมูลใน web.config ได้โดยอัตโนมัติ และกู้คืนข้อมูลที่กู้คืนผ่านการตั้งค่าตัวแปร
คุณต้องให้ความสนใจเมื่อทำการกู้คืน ปัญหาใหญ่ที่สุดคือ เมื่อผู้ใช้รายอื่นใช้ฐานข้อมูล พวกเขาจะไม่สามารถกู้คืนได้ วิธีแก้ไขคือการเพิ่มขั้นตอนที่เก็บไว้ในฐานข้อมูล MASTER:
สร้าง proc killspid (@dbname varchar (20))
เช่น
เริ่ม
ประกาศ @sql nvarchar (500)
ประกาศ @spid int
ตั้งค่า @sql='ประกาศเคอร์เซอร์ getspid สำหรับ
เลือก spid จาก sysprocesses โดยที่ dbid=db_id( '''+@dbname+''')'
ผู้บริหาร(@sql)
เปิด getpid
ดึงข้อมูลถัดไปจาก getspid ไปที่ @spid
ในขณะที่ @@fetch_status<>-1
เริ่ม
exec('ฆ่า '+@spid )
ดึงข้อมูลถัดไปจาก getspid ไปที่ @spid
จบ
ปิด getpid
ยกเลิกการจัดสรรgetpid
จบ
ไป
หากต้องการดำเนินการตามขั้นตอนที่เก็บไว้นี้ก่อนที่จะกู้คืน คุณต้องส่ง dbname ซึ่งเป็นชื่อของฐานข้อมูลของคุณ ต่อไปนี้เป็นรหัสต้นฉบับของคลาส: (สตริงการเชื่อมต่อฐานข้อมูลใน web.config คือ constr)
การใช้
System.Configuration;
การใช้ System.Data.SqlClient;
การใช้ System.Data;
namespace web.base_class
{
/// <summary>
/// คลาส DbOper ส่วนใหญ่ใช้ SQLDMO เพื่อตระหนักถึงการสำรองข้อมูลและการกู้คืนของ Microsoft SQL Server ฐานข้อมูล
/// </summary>
DbOper คลาสสาธารณะ
{
สตริงส่วนตัว
uid;
ฐานข้อมูลสตริงส่วนตัว
///
<
สรุป
>
/// ตัวสร้างคลาส DbOper
สรุป>
DbOper สาธารณะ ()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
server=cut(conn
,"server=",";");
=",";");
pwd=cut(conn,"pwd=",";");
database=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(";"));
กลับย่อย
;
/// <summary>
/// การสำรองฐานข้อมูล
/// </summary>
บูลสาธารณะ DbBackup (URL สตริง)
{
SQLDMO.Backup oBackup = SQLDMO.BackupClass ใหม่ ()
;
ลอง
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = ฐานข้อมูล;
oBackup.Files = url;//"d:Northwind.bak ";
oBackup.BackupSetName = Database;
oBackup.BackupSetDescription = "Database Backup";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
return true;
}
catch
{
return false;
Throw;
}
ในที่สุด
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// การกู้คืนฐานข้อมูล
/// </summary>
สตริงสาธารณะ DbRestore (URL สตริง)
{
if(exepro()!=true)//ดำเนินการขั้นตอนที่เก็บไว้
{
return "การดำเนินการล้มเหลว"
}
else
{
SQLDMO.Restore oRestore = ใหม่
SQLDMO.SQLServer oSQLServer = ใหม่ SQLDMO.SQLServerClass();
ลอง
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server,uid
, pwd);
.SQLDMORestore_Database;
oRestore.Database
= ฐานข้อมูล
;
oRestore.SQLRestore
(
oSQLServer);
;
}
catch(Exception e)
{
return "ล้มเหลวใน
การกู้คืนฐานข้อมูล";
}
ใน
ที่สุด
{
oSQLServer.DisConnect();
}
}
บูลส่วนตัว exepro()
{
SqlConnection conn1 = new SqlConnection("server="+server+"; uid ="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = ใหม่ SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dbname " ,"port");
ลอง
{
conn1.Open();
cmd.ExecuteNonQuery();
return true;
}
catch(Exception ex)
{
return false;
}
ในที่สุด
{
conn1.Close();
}
}
}
}