تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
استعادة نسخ احتياطي
#1
Heart 
السلام عليكم اخوتي الاعزار
استخدمت الكود المرفق في اسفل لعمل تسخ احتياطي واستعادة في النسخ نجح الامر لكن في الاستعادة يعطي خطا كما في الصور
(كود النسخ الاحتياطي)
كود :
   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 مع الشكر


الملفات المرفقة صورة/صور
   
الرد
تم الشكر بواسطة:
#2
وعليكم السلام ورحمة الله وبركاته

تفضل اخى هذا كود الاستدعاء
كود :
           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 تجنباً لمشكلة خطاء المسار فى الاسترجاع

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد
تم الشكر بواسطة: بدري
#3
شكرا لك اخي العزيز لكن عند كتابة الكود يعطي خطا تحت (con.State) مع الشكر
كود :
               if (con.State = ConnectionState.Closed) { con.Open(); }
استبدلته بالكود التالي ايضا يعطي خطا 
كود :
if (con.State == ConnectionState.Closed) { con.Open(); }


الملفات المرفقة صورة/صور
   
الرد
تم الشكر بواسطة:
#4
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 ="";
}
الرد
تم الشكر بواسطة: asemshahen5
#5
بخصوص الصورة فى ردك قبل الاخير
يشير ان الاتصال بقاعدة البيانات من خلال الكود غير صحيح

وقد يكون السبب بان سيرفر 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

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

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد
تم الشكر بواسطة: رسول555
#6
احسنت وجعله الله في ميزان حسناتك يا اخي العزيز
الرد
تم الشكر بواسطة: elgokr


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سؤال] كود نسخ احتياطي SQL HLibyan 3 245 31-10-18, 04:25 PM
آخر رد: alsouf

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم