في المرة الأخيرة التي عملت فيها على مشروع يتضمن استعادة قاعدة البيانات واستعادتها، قمت بالبحث عبر الإنترنت ووجدت أنه تم تنفيذه باستخدام 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
باستخدام
مساحة الاسم web.base_class
{
/// <summary >
/// تستخدم فئة DbOper بشكلأساسي
SQLDMO لتنفيذ النسخ الاحتياطي والاسترداد لقاعدة بيانات Microsoft SQL Server
/// </summary>
public class DbOper
{
Private
string
uid
;
string conn ;
/// <summary>
/// منشئ فئة DbOper
/// </summary>
public
DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
( conn، "server = "؛")؛
uid=cut(conn،"uid = "؛"
)
؛
, "database=";");
}
public stringcut(string str,string bg,string ed)
{
string
sub=str.Substring(str.IndexOf(bg)+bg.Length)
; Substring(0,sub.IndexOf(";"));
return sub
}
;
/// <summary>
/// النسخ الاحتياطي لقاعدة البيانات
/// </summary>
public bool DbBackup(string url)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
حاول
{
oSQLServer.LoginSecure=
false;
oSQLServer.Connect(server,uid, pwd
)
;
"؛
oBackup.BackupSetName = قاعدة البيانات؛
oBackup.BackupSetDescription = "النسخ الاحتياطي لقاعدة البيانات"؛
oBackup.Initialize = صحيح؛
oBackup.SQLBackup(oSQLServer)؛
return true;
}
Catch
{
return false;
throw;
}
أخيرا
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// استرداد قاعدة البيانات
/// </summary>
public string DbRestore(string url)
{
if(exepro()!=true)// تنفيذ الإجراء المخزن
{
return "فشلت العملية"
}
else
{;
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLServer oSQLServer = new SQLDMO.SQLServerClass();
حاول
{
oSQLServer.LoginSecure
= false
;
.SQLDMORestore_Database;
oRestore.Database = data;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber
= 1
;
oRestore.SQLRestore(oSQLServer);
}
Catch(
Exception e)
{
return
"فشل
في استعادة قاعدة البيانات
"
;
}
أخيرًا
{
oSQLServer.DisConnect
(
)
;
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();
return true;
}
Catch(Exception ex)
{
return false;
}
أخيرا
{
conn1.Close();
}
}
}
}