ครั้งล่าสุดที่ฉันทำงานในโครงการที่เกี่ยวข้องกับการกู้คืนและการกู้คืนฐานข้อมูล ฉันค้นหาทางออนไลน์และพบว่ามีการใช้งานโดยใช้ 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.Data.SqlClient;
ใช้ System.Data;
เนมสเปซ web.base_class
-
/// <สรุป>
/// คลาส DbOper ส่วนใหญ่ใช้ SQLDMO เพื่อทำการสำรองและกู้คืนฐานข้อมูล Microsoft SQL Server
/// </สรุป>
DbOper คลาสสาธารณะ
-
เซิร์ฟเวอร์สตริงส่วนตัว
uid สตริงส่วนตัว
pwd สตริงส่วนตัว;
ฐานข้อมูลสตริงส่วนตัว
conn สตริงส่วนตัว;
/// <สรุป>
/// ตัวสร้างคลาส DbOper
/// </สรุป>
DbOpera สาธารณะ ()
-
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
เซิร์ฟเวอร์=ตัด(conn,"เซิร์ฟเวอร์=",";");
uid=cut(conn,"uid=",";");
pwd=cut(conn,"pwd=",";");
ฐานข้อมูล=ตัด(conn,"ฐานข้อมูล=",";");
-
การตัดสตริงสาธารณะ (string str, string bg, string ed)
-
สตริงย่อย;
ย่อย=str.Substring(str.IndexOf(bg)+bg.Length);
sub=sub.Substring(0,sub.IndexOf(";"));
กลับย่อย;
-
/// <สรุป>
/// สำรองฐานข้อมูล
/// </สรุป>
บูลสาธารณะ DbBackup (URL สตริง)
-
SQLDMO.Backup oBackup = SQLDMO.BackupClass ใหม่ ();
SQLDMO.SQLServer oSQLServer = SQLDMO.SQLServerClass ใหม่();
พยายาม
-
oSQLServer.LoginSecure = เท็จ;
oSQLServer.Connect(เซิร์ฟเวอร์,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = ฐานข้อมูล;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = ฐานข้อมูล;
oBackup.BackupSetDescription = "การสำรองฐานข้อมูล";
oBackup.Initialize = จริง;
oBackup.SQLBackup(oSQLServer);
กลับเป็นจริง;
-
จับ
-
กลับเท็จ;
โยน;
-
ในที่สุด
-
oSQLServer.DisConnect();
-
-
/// <สรุป>
/// การกู้คืนฐานข้อมูล
/// </สรุป>
สตริงสาธารณะ DbRestore (สตริง url)
-
if(exepro()!=true)//ดำเนินการขั้นตอนที่เก็บไว้
-
กลับ "การดำเนินการล้มเหลว";
-
อื่น
-
SQLDMO.Restore oRestore = SQLDMO.RestoreClass ใหม่();
SQLDMO.SQLServer oSQLServer = SQLDMO.SQLServerClass ใหม่();
พยายาม
-
oSQLServer.LoginSecure = เท็จ;
oSQLServer.Connect(เซิร์ฟเวอร์, uid, pwd);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = ฐานข้อมูล;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = จริง;
oRestore.SQLRestore(oSQLServer);
กลับ "ตกลง";
-
จับ (ยกเว้น e)
-
กลับ "ไม่สามารถกู้คืนฐานข้อมูล";
โยน;
-
ในที่สุด
-
oSQLServer.DisConnect();
-
-
-
บูลส่วนตัว exepro()
-
SqlConnection conn1 = ใหม่ SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dbname", "พอร์ต");
พยายาม
-
conn1.เปิด();
cmd.ExecuteNonQuery();
กลับเป็นจริง;
-
จับ (ข้อยกเว้นเช่น)
-
กลับเท็จ;
-
ในที่สุด
-
conn1.ปิด();
-
-
-
-