منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : استعادة نسخ احتياطي
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم اخوتي الاعزار
استخدمت الكود المرفق في اسفل لعمل تسخ احتياطي واستعادة في النسخ نجح الامر لكن في الاستعادة يعطي خطا كما في الصور
(كود النسخ الاحتياطي)
كود :
   if (textBox1.Text == "")
           {
               MessageBox.Show("اختار مكان حفظ القاعدة");
           }
           else
           {
               string failename = textBox1.Text + "\\DB" + " - " + DateTime.Now.ToShortDateString().Replace('/', '-') + " - " + DateTime.Now.ToShortTimeString().Replace(':', '-');
               string strbk = "Backup Database DB To Disk='" + failename + ".bak'";
               cmd = new SqlCommand(strbk, con);
               con.Open();
               cmd.ExecuteNonQuery();
               con.Close();
               MessageBox.Show("تم انشاء نسخة احتياطية", "نسخ احتياطي", MessageBoxButtons.OK, MessageBoxIcon.Information);
           }
           

(كود الاستعادة الذي يعطي خطا)
كود :
       private void button1_Click(object sender, EventArgs e)
       {
           if (textBox1.Text == "")
           {
               MessageBox.Show("اختار نسخة القاعدة");
           }
           else
           {
               string strbk = "ALTER Database DB SET OFFLINE WITH ROLLBACK IMMEDIATE; Restore Database DB From Disk='" + textBox1.Text + "'";
               cmd = new SqlCommand(strbk, con);
               con.Open();

               cmd.ExecuteNonQuery();
               con.Close();
               MessageBox.Show("تم استعادة النسخة الاحتياطية ", "استعادة", MessageBoxButtons.OK, MessageBoxIcon.Information);
           }
           }

Heart HeartHeart مع الشكر
وعليكم السلام ورحمة الله وبركاته

تفضل اخى هذا كود الاستدعاء
كود :
           if (textBox1.Text == "")
           {
               MessageBox.Show("اختار نسخة القاعدة");
           }
           else
           {
               string strbk = "ALTER Database DB SET OFFLINE WITH ROLLBACK IMMEDIATE; Restore Database DB From Disk='" + textBox1.Text + "' ALTER DATABASE DB SET ONLINE WITH ROLLBACK IMMEDIATE";
               cmd = new SqlCommand(strbk, con);
               if (con.State = ConnectionState.Closed) { con.Open(); }
               cmd.ExecuteNonQuery();
               con.Close();
               MessageBox.Show("تم استعادة النسخة الاحتياطية ", "استعادة", MessageBoxButtons.OK, MessageBoxIcon.Information);
           }

كل ما كان ينقصه فقط كود تحويل قاعدة البيانات من OFFLINE الى ONLINE
وكل ما عليك ان تتاكد ان اختيار المسار صحيح فى textBox1 تجنباً لمشكلة خطاء المسار فى الاسترجاع

تحياتى لك
وتمنياتى لك التوفيق
شكرا لك اخي العزيز لكن عند كتابة الكود يعطي خطا تحت (con.State) مع الشكر
كود :
               if (con.State = ConnectionState.Closed) { con.Open(); }
استبدلته بالكود التالي ايضا يعطي خطا 
كود :
if (con.State == ConnectionState.Closed) { con.Open(); }
Heart شكرا لكم اخوتي الاعزاء تم حل المشكلة وقد استخدمت الكود التالي اذا امكن احد يستطيع شرح الكود Heart
كود :
 private void button4_Click(object sender, EventArgs e)
       {
           if (textBox2.Text == "")


           {
               MessageBox.Show("لاتوجد بيانات لاستعادتها");
           }
           else
           {
               string database = con.Database.ToString();
               if (con.State != ConnectionState.Open)
               {
                   con.Open();
               }
               try
               {
                   string sqlStmt2 = string.Format("ALTER DATABASE [" + database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
                   SqlCommand bu2 = new SqlCommand(sqlStmt2, con);
                   bu2.ExecuteNonQuery();

                   string sqlStmt3 = "USE MASTER RESTORE DATABASE [" + database + "] FROM DISK='" + textBox2.Text + "'WITH REPLACE;";
                   SqlCommand bu3 = new SqlCommand(sqlStmt3, con);
                   bu3.ExecuteNonQuery();

                   string sqlStmt4 = string.Format("ALTER DATABASE [" + database + "] SET MULTI_USER");
                   SqlCommand bu4 = new SqlCommand(sqlStmt4, con);
                   bu4.ExecuteNonQuery();

                   MessageBox.Show("تم استعادة النسخة الاحتياطية ", "استعادة", MessageBoxButtons.OK, MessageBoxIcon.Information);
                   con.Close();

               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.ToString());
               }
             
           }
           textBox2.Text ="";
}
بخصوص الصورة فى ردك قبل الاخير
يشير ان الاتصال بقاعدة البيانات من خلال الكود غير صحيح

وقد يكون السبب بان سيرفر SQL كان مغلق ويحتاج الى اعادة تشغيل
وكان ابسط ما يمكن حل المشكلة سريعاً هو اعادة تشغيل Windows

بخصوص ردك الاخير لكود الحل هو نفسه الكود الذى كنت تستخدمه

ولكن قام بتقسيم كود التنفيذ على مرحلتين وهو المرحلة الاولى
كود :
"ALTER DATABASE [" + database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ومن ثم قام بتنفيذ عملية الاسترجاع فى المرحلة الثانية من خلال
كود :
USE MASTER RESTORE DATABASE [" + database + "] FROM DISK='" + textBox2.Text + "'WITH REPLACE;

ومن ثم قام بتنفيذ المرحلة الثالثة وهى الاعادة لما تم فى المرحلة الاولى من خلال
كود :
ALTER DATABASE [" + database + "] SET MULTI_USER

والفكرة من جملة SINGLE_USER و MULTI_USER
هو نفسه الكود لديك فى الاساس واللى هو OFFLINE و ONLINE 

الفكرة منها لو كان قاعدة البيانات تحتوى على عدد من المستخدمين لتعدد الاستخدام
فمثلاً انت عامل اسم مستخدم باسم user1 للبرنامج الخاص بك
ويستخدم قاعدة البيانات فى برنامج اخر تحت مستخدم باسم user2

فكل من SINGLE_USER  و  OFFLINE
هو لتعطيل جميع المستخدمين اى ايقافهم عن العمل 

فكل من MULTI_USER و  ONLINE 
هو لتفعيل جميع المستخدمين اى لاعادة العمل للمستخدمين


واضافة لما قام به مضافاً عن كودك ببداية الموضوع

وهو انه استخدم اسم قاعدة البيانات من خلال جلبه تلقائي من كود الاتصال con
من خلال هذا الكود
كود :
string database = con.Database.ToString();

لانك كنت تكتب اسم قاعدة البيانات يدوياً وهو باسم
كود :
DB

اتمنى ان تكون الصورة وضحت معك

تحياتى لك
وتمنياتى لك التوفيق
احسنت وجعله الله في ميزان حسناتك يا اخي العزيز