في المرة الأخيرة التي عملت فيها على مشروع يتضمن استعادة قاعدة البيانات واستعادتها، قمت بالبحث عبر الإنترنت ووجدت أنه تم تنفيذه باستخدام 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)
use System
;
use
System.Configuration
;
use
System.Data.SqlClient
;
قاعدة البيانات
/// </summary>
public class DbOper
{
سلسلة خاصة
uid؛
قاعدة بيانات سلسلة خاصة
؛
///
<summary>
/// مُنشئ فئة DbOper
/// </ Summary>
public DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
server=cut(conn,"server=";")
; ="،"؛")؛
pwd=cut(conn،"pwd = "،"؛")؛
قاعدة البيانات = قطع (conn، "database = "،"؛")؛
}
قطع السلسلة العامة (سلسلة str، سلسلة bg ,string ed)
{
string
sub=str.Substring(str.IndexOf(
bg)+bg.Length);
sub=sub.Substring(0,sub.IndexOf(
";"));
/// <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();
}
}
}
}