في المرة الأخيرة التي عملت فيها على مشروع يتضمن استعادة قاعدة البيانات واستعادتها، قمت بالبحث عبر الإنترنت ووجدت أنه تم تنفيذه باستخدام SQLDMO، كل ما عليك فعله هو إضافة مرجع SQLDMO، ثم استخدام أساليب الفئات التالية لتحقيق ذلك.
لقد قمت بتوسيع فئة المؤلف الأصلي حتى يتمكن تلقائيًا من التعرف على سلسلة اتصال قاعدة البيانات في web.config واستعادة المعلومات المستردة من خلال الإعدادات المتغيرة.
يجب عليك الانتباه عند الاستعادة. المشكلة الأكبر هي عند الاستعادة، عندما يستخدم المستخدمون الآخرون قاعدة البيانات، فإن الحل هو إضافة إجراء مخزن في قاعدة البيانات MASTER.
إنشاء proc killspid (@dbname varchar(20))
مثل
يبدأ
أعلن @sql nvarchar (500)
أعلن @spid int
set @sql='declare getpid cursor for
حدد spid من sysprocesses حيث dbid=db_id( '''+@dbname+''')'
تنفيذي (@sql)
افتح getpid
جلب التالي من getpid إلى @spid
بينما @@fetch_status<>-1
يبدأ
تنفيذي('قتل '+@spid )
جلب التالي من getpid إلى @spid
نهاية
إغلاق getpid
إلغاء تخصيصgetpid
نهاية
يذهب
لتنفيذ هذا الإجراء المخزن قبل الاستعادة، تحتاج إلى تمرير dbname، وهو اسم قاعدة البيانات الخاصة بك. ما يلي هو الكود الأصلي للفئة: (سلسلة اتصال قاعدة البيانات في web.config هي constr)
باستخدام النظام؛
باستخدام System.Configuration؛
باستخدام System.Data.SqlClient؛
باستخدام System.Data؛
مساحة الاسم web.base_class
{
/// <الملخص>
/// تستخدم فئة DbOper بشكل أساسي SQLDMO لتحقيق النسخ الاحتياطي والاسترداد لقاعدة بيانات Microsoft SQL Server
/// </الملخص>
الطبقة العامة DbOper
{
خادم سلسلة خاصة؛
معرف سلسلة خاصة؛
سلسلة خاصة للأشخاص ذوي الإعاقة؛
قاعدة بيانات سلسلة خاصة؛
اتصال سلسلة خاصة؛
/// <الملخص>
/// مُنشئ فئة DbOper
/// </الملخص>
DbOper () العامة
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
server=cut(conn,"server=";");
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(";"));
العودة الفرعية؛
}
/// <الملخص>
/// النسخ الاحتياطي لقاعدة البيانات
/// </الملخص>
المنطق العام DbBackup (سلسلة عنوان url)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
يحاول
{
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 = قاعدة البيانات؛
oBackup.BackupSetDescription = "النسخ الاحتياطي لقاعدة البيانات";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
عودة صحيحة؛
}
يمسك
{
عودة كاذبة.
يرمي؛
}
أخيراً
{
oSQLServer.DisConnect();
}
}
/// <الملخص>
/// استعادة قاعدة البيانات
/// </الملخص>
سلسلة عامة DbRestore (عنوان url للسلسلة)
{
if(exepro()!=true)//تنفيذ الإجراء المخزن
{
إرجاع "فشلت العملية"؛
}
آخر
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
يحاول
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server, uid, pwd);
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);
العودة "حسنا"؛
}
قبض (استثناء ه)
{
إرجاع "فشل في استعادة قاعدة البيانات"؛
يرمي؛
}
أخيراً
{
oSQLServer.DisConnect();
}
}
}
منطق خاص 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();
عودة صحيحة؛
}
قبض (استثناء على سبيل المثال)
{
عودة كاذبة.
}
أخيراً
{
conn1.Close();
}
}
}
}