Backup data to file

شئ مهم جدا أن نعرف كيف نبني نسخة إحتياطية من ملفات الداتا بيز ثم نحتفظ بها في مكان ما و تسترجعها عندما يحدث خلل ما في النسخة الاصلية

الفكرة
 
الفكرة المستخدمة يمكن تقسيمها الي ثلاثة مراحل كالتالي

المرحلة الأولي
إسترجاع البيانات الموجودة في الداتا بيز علي شكل جدول
 DataTable
تحديدا لماذا نستخدم
 DataTable Class
 ....لأن هذا الكلاس و بشكل عام يمثل واحدا من أهم همزات الوصل بين  كل من الداتا بيز و واجهة التطبيق الخاصة بالبرنامج

المرحلة الثانية
حفظ البيانات الموجودة في
 DataTable
إلي ملف
باستخدام
 BinaryWriter


المرحلة الثالثة
إسترجاع البيانات من الملف علي شكل
 DataTable
 و ذلك باستخدام
BinaryReader

توضيح

أول مشكلة ربما تواجهنا في كتابة الكود هي صعوبة تعميم الكود حيث أن كل مبرمج قد يعطي إسما مختلفا لكل عمود في الداتا بيز و بما أنه لا يوجد هناك قوانين ثابتة لتسمية الأعمدة في الداتا بيز أو في 
DataTable
 فكان صعب جدا تعميم الكود ليقرأ كل الأعمدة
 سواء من الداتا بيز او من
 DataTable

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

عموما وكبداية سأوضح كيف نفعل هذا مع قاعدة بيانات بها بعض الأعمدة من النوع
 String
 وهنا أنا أفترض أن من يقرأ هذا الموضوع لديه قاعدة بيانات بها بعضا من الأعمدة و مدخلاتها عبارة عن
 String


الكود

المرحلة الأولي
تحويل بعضا من البيانات الموجودة في الداتابيز إلي
 DataTable
الكود التالي مأخوذ من موقع مايكروسوفت و أنا فقط أعدت صياغته و يمكن إستخدامه في تحويل ملف الداتا بيز إلي
 DataTable  

Friend Function GetData(sqlCommand As StringconnectionString As String) As DataTable
        Dim table 
As DataTable CType(NothingDataTable)
 
       Using conn As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(connectionString)
 
           Dim command As New System.Data.SqlClient.SqlCommand(sqlCommandconn)
 
           Dim adapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter()
 
           adapter.SelectCommand command
            table 
= New DataTable() With {.Locale System.Globalization.CultureInfo.InvariantCulture}
 
           adapter.Fill(table)
 
       End Using

        Return table
    End 
Function

و بما أنني ليس لدي
 SQL
 و أيضا ليس لدي
 MS Access

 لذلك و لتفادي الخطأ في تنفيذ بقية الكود لذلك سوف أبني 
DataTable
 بسيط و أستخدمه و الكود التالي يوضح ذلك

Private Function BuildDataTable() As DataTable
        Dim keys 
As Integer() = New Integer() {12345}
 
       Dim names As String() = New String() {"Omar Amin""Ahmed Mohamed""Al Ezzat""Mohamed Ali""Hamada Farag"}
 
       Dim phones As String() = New String() {"01099999999""01088888888""01077777777""01066666666""01055555555"}
 
       Return BuildDataTable(keysnamesphones)
 
   End Function

 
   Private Function BuildDataTable(keys As Integer(), names As String(), phones As String()) As DataTable

        Dim table 
As DataTable CType(NothingDataTable)
 
       table = New DataTable With {.Locale System.Globalization.CultureInfo.InvariantCulture}
 
       table.Columns.Add(New DataColumn("Key"GetType(Integer)))
 
       table.Columns.Add(New DataColumn("Name"GetType(String)))
 
       table.Columns.Add(New DataColumn("Phone"GetType(String)))
 
       SyncLock keys.GetType
            For i 
As Integer 0 To keys.Count 1
                table
.Rows.Add(New Object() {keys(i), names(i), phones(i)})
 
           Next
            Return table

        End SyncLock
    End 
Function 

المرحلة الثانية

حفظ البيانات في ملف
و الكود التالي يوضح ذلك و ما يهمني توضيحه هنا هو أن عملية حفظ البيانات في الملف يجب ان تتم بترتيب مناسب حيث أن هذا الترتيب سيتم إستخدامه في إسترجاع البيانات من الملف لاحقا
مثلا لو أردنا أن نحفظ عدد الأعمده ثم نحفظ أسماء الأعمده ..... و هكذا يجب أن يتم إسترجاع البيانات بنفس الترتيب

  

Friend Function CanSaveDataToFile(table As DataTablepassWord As Stringfilename As String) As Boolean

        Using writer 
As New System.IO.BinaryWriter(System.IO.File.Open(filenameSystem.IO.FileMode.Create))
 
           ' sequence of writing data is very important as we shall read data with the same sequence
            ' 
first write the password
            
' password my encrypted if required by some means
            ' 
you may use any data type for datat protection
            writer
.Write(passWord)

 
           ' second write data columns count and names
            Dim columns As DataColumnCollection = table.Columns
            ' 
write column's count
            writer.Write(columns.Count)
            For Each column As DataColumn In columns
                writer.Write(column.ColumnName)
            Next

            ' 
then write table rows count and values
            Dim rows 
As DataRowCollection table.Rows
            
' write row's count
            writer
.Write(rows.Count)
 
           For Each row As DataRow In table.Rows
                For i 
As Integer 0 To columns.Count 1
                    
' write row's values as strinng
                    
' currently the data row values are saved as string
                    writer.Write(row(i))
                Next
            Next
            Return True
        End Using
        Return False
    End Function

المرحلة الثالثة

إسترجاع البيانات من الملف
و عملية إسترجاع البيانات تتم بنفس ترتيب عملية حفظ البيانات
و الكود التالي يوضح ذلك 

   Friend Function FileToDataTable(passWord As Stringfilename As String) As DataTable

        Dim table 
As DataTable CType(NothingDataTable)
 
       If (System.IO.File.Exists(filename)) Then
            Using reader 
As New System.IO.BinaryReader(System.IO.File.Open(filenameSystem.IO.FileMode.Open), New System.Text.UTF8Encoding(FalseFalse))
 
               ' check the protection string, you may use any data type for protecting the file
                Dim protection As String = reader.ReadString
                If protection <> passWord Then
                    Return Nothing
                End If

                table = New DataTable With {.Locale = System.Globalization.CultureInfo.InvariantCulture}
                Dim columns As DataColumnCollection = table.Columns
                Dim columnsCount As Integer = reader.ReadInt32()
                For i As Integer = 0 To columnsCount - 1
                    ' 
read the column's name
                    Dim columnName As String = reader.ReadString()
                    columns.Add(columnName)
                Next

                ' 
read row's count
                Dim rowsCount As Integer = reader.ReadInt32()
                For j As Integer = 0 To rowsCount - 1
                    Dim row As DataRow = table.NewRow()
                    For k As Integer = 0 To columnsCount - 1
                        ' 
read row's values as strinng
                        row(k) = reader.ReadString()
                    Next
                    table.Rows.Add(row)
                Next

            End Using
        End If
        Return table
    End Function 

Comments

Popular posts from this blog

مقدمة الي تشفير الحروف الأبجدية العربية

VB.NET Translucent Control using GDI+

Add Custom Event to a Class in VB.NET