تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
الغزل مع SQL Server
#6
بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله و بركاته
نستكمل اليوم مشوارنا .
سنتحدث اليوم عن طريقة  انشاء صورة و استرجاعها.
اولا سابدأ بطريقة إنشاء صورة لقاعدة البيانات التي يتم تحديدها في صندوق القواعد .
نضيف بعض الادوات على المشروع , الصورة التالية توضح هذه الادوات.

  1. TextBox نسميه TextBox3
  2. TextBox نسميه folderpath
  3. TextBox نسميه txtrestorename
  4. Button نسميه  Button2
  5. Button نسميه  Button3
  6. Button نسميه  Button4
  7. ProgressBar نسميه ProgressBar1



عمل صورة Backub

يمكننا كائن Backub المشمول ضمن SqlSmo  من إنشاء صورة لقاعدة البيانات.
الكائن Backub يحوي عدة خصائص يمكنك استعراضها بعد انشاء نسخة من هذا الكائن بالطريقة التالية.

كود :
Dim backup As New Backup()


بعد انشاء نسخة من الكائن انت بحاجة الى تحديد نوع العنصر و اسمه وهي هنا قاعدة البيانات و اسمها.
و كما يمكننا التقاط حدث المعالجة (اقصد شريط
Progress ) الخاص بـــ SqlServer ليدلنا على ان العملية قد تمت او لا.
لنبدأ بأعطاء معلومات لكائن Backub كما يلي:

كود :
Dim database As Database = srv.Databases(LstDbs.SelectedItem.ToString)
           Dim backup As New Backup()
           backup.Action = BackupActionType.Database
           backup.Database = database.Name


بعد ذلك نحن بحاجة لتحديد مسار الصورة و نوعها.
انوه هنا على انني استخدمت الكائن
FolderBrowserDialog ليقوم المستخدم بتحديد المسار يدويا.
بامكانك سحب الكائن من صندوق الادوات او تعريفه ضمن الكود و التعامل معه,انا اضفته من صندوق الادوات.
اضف عنصر
FolderBrowserDialog  و سميه FolderBkBros , او قم بتعريفه على حسب رغبتك.
الان علينا معالجة بعض الامور البسيطة لان الغاية من الكائن
FolderBrowserDialog هو فتح مستعرض المجلدات
للبحث عن صور قواعد البيانات من النوع (*.bak) التي سننشأها لاحقا و كذلك الاحتفاظ بالمسار المفتوح و تخزينه في اعدادات البرنامج
ليفتح كل مرة على اخر مسار تم حفظه.
لذلك وجب علي ان اضيف متغير من النوع النصي لاعدادات البرنامج.
اذهب الى خصائص المشروع ثم الى التبويب
Settings و اضف متغير نصي من النوع String و سميه BrowseBk
و اعطيه القيمة (D:\) و هو المسار الافتراضي الذي سيفتح عليه المستعرض لاول مرة ثم بعد ذلك سيتبدل و يحتفظ بالقيمة الجديدة
التي تختارها انت , الصورة التالية توضح المطلوب:



ملاحظة:الطريقة السابقة تفيدك كثيرا في التعامل مع تخزين نصوص الاتصال لقواعد البيانات في حال تغير مسار القاعدة.

بعد ذلك نحن بحاجة للقليل من الكود في حدث النقر على Button3 نكتب ما يلي:

كود :
   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click

       FolderBkBros.ShowDialog()
       Try
           If Windows.Forms.DialogResult.Yes = Windows.Forms.DialogResult.Yes Then
               folderpath.Text = FolderBkBros.SelectedPath

               My.Settings.BrowseBk = FolderBkBros.SelectedPath
               My.Settings.Save()

               Dim dir As New System.IO.DirectoryInfo(folderpath.Text)
               bkfiles.Items.Clear()

               For Each f As System.IO.FileInfo In dir.GetFiles("*.bak", SearchOption.AllDirectories)
                   bkfiles.Items.Add(f.Name)
               Next

           Else

               Dim dir As New System.IO.DirectoryInfo(folderpath.Text)
               bkfiles.Items.Clear()

               For Each f As System.IO.FileInfo In dir.GetFiles("*.bak", SearchOption.AllDirectories)
                   bkfiles.Items.Add(f.Name)
               Next

           End If


       Catch ex As Exception

       End Try





   End Sub


الكود السابق يقوم بجلب كل ملفات (*.bak) في المسار المحدد و عرضها في قائمة
bkfiles
و الاحتفاظ بالمسار في اعدادات البرنامج كما اسلفنا.

نعود الى الزر
Button2 الذي سيقوم بانشاء صورة لقاعدة البيانات المحددة في مربع النص TextBox3
و يخزنها في المسار الذي حددناه قبل قليل و المعروض في مربع النص folderpath.
الكود التالي سيتكفل بالامر :

كود :
   Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

       'عمل النسخة الاحتياطية


       If TextBox3.Text.Length > 0 Then
           Dim database As Database = srv.Databases(LstDbs.SelectedItem.ToString)
           Dim backup As New Backup()
           backup.Action = BackupActionType.Database
           backup.Database = database.Name

           If MessageBox.Show(TextBox3.Text & "  انت على وشك عمل نسخة احتياطية للقاعدة  " & vbCrLf & folderpath.Text & " المسار الافتراضي ", "نسخة احتياطية", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign) = Windows.Forms.DialogResult.Yes Then
               backup.Devices.AddDevice(FolderBkBros.SelectedPath & "\" & Trim(TextBox3.Text) & Date.Now.ToString("dd-MM-yyyy-hh.mm") & ".bak", DeviceType.File)
               ' backup..
               backup.PercentCompleteNotification = 10
               AddHandler backup.PercentComplete, AddressOf Me.ProgressEventHandler

               backup.SqlBackup(srv)

               MessageBox.Show("تمت العملية", "نسخة احتياطية", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
               ProgressBar1.Value = 0

               Try
                   folderpath.Text = FolderBkBros.SelectedPath
                   Dim dir As New System.IO.DirectoryInfo(folderpath.Text)
                   bkfiles.Items.Clear()

                   For Each f As System.IO.FileInfo In dir.GetFiles("*.bak", SearchOption.AllDirectories)
                       bkfiles.Items.Add(f.Name)
                   Next
               Catch ex As Exception

               End Try



           Else
               MessageBox.Show("تم الغاء العملية", "نسخة احتياطية", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
           End If
       Else
           MessageBox.Show("لم يتم تحديد القاعدة", "نسخة احتياطية", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)

       End If

       If srv.ConnectionContext.IsOpen Then
           srv.ConnectionContext.Disconnect()
       End If
   End Sub


اما بالنسبة لمعالجة حدث
percentcomplete فعليك اضافة هذا الاجراء:

كود :
Public Sub ProgressEventHandler(sender As Object, e As PercentCompleteEventArgs)
       Me.ProgressBar1.Value = e.Percent
   End Sub

طبعا انا خزنت اسم القاعدة مع ارسال التاريخ و الساعة و الدقيقة ليكون اسم الصورة اكثر وضوحا.
بهذا اصبح بامكاننا عمل صورة لاي قاعدة بيانات نريدها وفق المسار الذي نحدده.


الاستعادة Restore

كما هو الحال مع كائن Backub يمكننا إنشاء كائن Restore و التعامل مع خصائصه بسهولة
نحتاج الى نوع الملف و اسم الملف و مساره .
التالي كود الزر
Button4 الخاص بالاستعادة.

كود :
   Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
       'الاسترجاع

       If TextBox3.Text = "" Then
           MessageBox.Show("يرجى تحديد اسم القاعدة اولا", "إستعادة النسخة", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
           Exit Sub
       ElseIf txtrestorename.Text = "" Then
           MessageBox.Show("يرجى تحديد نسخة الاسترجاع", "إستعادة النسخة", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
           Exit Sub
       End If

       If MessageBox.Show(TextBox3.Text & "  انت على وشك عمل إستعادة صورة للقاعدة  " & vbCrLf & txtrestorename.Text & " إسم ملف الصورة " & vbCrLf & "يرجى التاكد من تطابق الاسماء", "إسترجاع نسخة", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign) = Windows.Forms.DialogResult.Yes Then

           Try

               Dim database As Database = srv.Databases(LstDbs.SelectedItem.ToString)
               Dim restore As New Restore()
               restore.Action = RestoreActionType.Database
               restore.Devices.AddDevice(FolderBkBros.SelectedPath & "\" & bkfiles.SelectedItem.ToString, DeviceType.File)
               restore.Database = database.Name
               restore.PercentCompleteNotification = 10
               AddHandler restore.PercentComplete, AddressOf Me.ProgressEventHandler
               restore.ReplaceDatabase = True
               restore.SqlRestore(srv)
               MessageBox.Show("تمت العملية", "إستعادة النسخة", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
           Catch exSMO As SmoException
               MessageBox.Show(exSMO.ToString())
           Catch ex As Exception
               MessageBox.Show(ex.ToString())
           Finally
               Me.ProgressBar1.Value = 0
               If srv.ConnectionContext.IsOpen Then
                   srv.ConnectionContext.Disconnect()
               End If
           End Try


       Else
           MessageBox.Show("تم إالغاء عملية الإستعادة", "إستعادة النسخة", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)

       End If

   End Sub


لم يختلف عن الكود السابق كثيرا  بهذا الشكل نكون اصبحنا قادرين على استعادة اي نسخة لاي قاعدة.


اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}


الردود في هذا الموضوع
الغزل مع SQL Server - بواسطة nonoms - 25-03-14, 12:37 PM
RE: الغزل مع SQL Server - بواسطة nonoms - 25-03-14, 04:19 PM
RE: الغزل مع SQL Server - بواسطة Sajad - 25-03-14, 07:59 PM
RE: الغزل مع SQL Server - بواسطة ابو ابراهيم - 26-03-14, 06:13 AM
RE: الغزل مع SQL Server - بواسطة nonoms - 26-03-14, 05:32 PM
RE: الغزل مع SQL Server - بواسطة nonoms - 05-04-14, 01:31 AM
RE: الغزل مع SQL Server - بواسطة nonoms - 05-04-14, 04:49 AM
RE: الغزل مع SQL Server - بواسطة Sajad - 05-04-14, 10:48 AM
RE: الغزل مع SQL Server - بواسطة a_almisery - 05-04-14, 02:29 PM
RE: الغزل مع SQL Server - بواسطة مالكـ - 05-04-14, 04:25 PM
RE: الغزل مع SQL Server - بواسطة nonoms - 07-04-14, 05:13 AM
RE: الغزل مع SQL Server - بواسطة T.ALKATHIRI - 09-05-14, 04:20 AM
RE: الغزل مع SQL Server - بواسطة nonoms - 12-05-14, 12:14 AM
RE: الغزل مع SQL Server - بواسطة Omar Mekkawy - 05-06-14, 10:00 PM
RE: الغزل مع SQL Server - بواسطة Omar Mekkawy - 06-06-14, 01:12 PM
RE: الغزل مع SQL Server - بواسطة KH_Alaswad - 12-04-18, 12:47 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 07-06-19, 04:03 PM
RE: الغزل مع SQL Server - بواسطة elgokr - 08-06-19, 05:09 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 08-06-19, 09:59 PM
RE: الغزل مع SQL Server - بواسطة ابو ليلى - 09-06-19, 09:19 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 09-06-19, 10:18 PM
RE: الغزل مع SQL Server - بواسطة ابو ليلى - 10-06-19, 12:38 AM
RE: الغزل مع SQL Server - بواسطة asemshahen5 - 10-06-19, 01:55 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 10-06-19, 09:01 PM
RE: الغزل مع SQL Server - بواسطة Abdo hamed - 28-03-20, 09:38 PM


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


يقوم بقرائة الموضوع: