Backup data to file
شئ
مهم جدا أن نعرف كيف نبني نسخة إحتياطية من ملفات الداتا بيز ثم نحتفظ بها
في مكان ما و تسترجعها عندما يحدث خلل ما في النسخة الاصلية
الفكرة
الفكرة المستخدمة يمكن تقسيمها الي ثلاثة مراحل كالتالي
المرحلة الأولي
إسترجاع البيانات الموجودة في الداتا بيز علي شكل جدول
إسترجاع البيانات الموجودة في الداتا بيز علي شكل جدول
DataTable
تحديدا لماذا
نستخدم
DataTable Class
....لأن هذا الكلاس و بشكل عام يمثل واحدا من
أهم همزات الوصل بين كل من الداتا بيز و واجهة التطبيق الخاصة بالبرنامج
المرحلة الثانية
حفظ البيانات الموجودة في
DataTable
إلي ملف
باستخدام
BinaryWriter
المرحلة الثالثة
إسترجاع البيانات من الملف علي شكل
DataTable
و ذلك باستخدام
BinaryReader
توضيح
أول مشكلة ربما تواجهنا في كتابة الكود هي صعوبة تعميم الكود حيث أن كل مبرمج قد يعطي إسما مختلفا لكل عمود في الداتا بيز و بما أنه لا يوجد هناك قوانين ثابتة لتسمية الأعمدة في الداتا بيز أو في
أول مشكلة ربما تواجهنا في كتابة الكود هي صعوبة تعميم الكود حيث أن كل مبرمج قد يعطي إسما مختلفا لكل عمود في الداتا بيز و بما أنه لا يوجد هناك قوانين ثابتة لتسمية الأعمدة في الداتا بيز أو في
DataTable
فكان صعب جدا
تعميم الكود ليقرأ كل الأعمدة
سواء من الداتا بيز او من
DataTable
ثاني مشكلة سوف تواجهنا هي نوعية البيانات المستخدمة في كل عمود فهي قد تختلف طبقا لإحتياجات كل مبرمج أو طبقا لنوعية المتغيرات التي يتم تخزينها فبعض المبرمجين قد يخزن المعلومات في شكل تكست او في شكل تاريخ او في شكل رقم ..... الي أخره لذلك وهنا أيضا تأتي صعوبة تعميم الكود
ثاني مشكلة سوف تواجهنا هي نوعية البيانات المستخدمة في كل عمود فهي قد تختلف طبقا لإحتياجات كل مبرمج أو طبقا لنوعية المتغيرات التي يتم تخزينها فبعض المبرمجين قد يخزن المعلومات في شكل تكست او في شكل تاريخ او في شكل رقم ..... الي أخره لذلك وهنا أيضا تأتي صعوبة تعميم الكود
عموما وكبداية سأوضح كيف نفعل هذا مع قاعدة بيانات بها بعض الأعمدة من النوع
String
وهنا أنا أفترض أن من يقرأ هذا الموضوع لديه قاعدة بيانات بها بعضا من الأعمدة و مدخلاتها عبارة عن
String
الكود
المرحلة الأولي
تحويل بعضا من البيانات الموجودة في الداتابيز إلي
تحويل بعضا من البيانات الموجودة في الداتابيز إلي
DataTable
الكود التالي مأخوذ من موقع مايكروسوفت و أنا فقط أعدت صياغته و يمكن إستخدامه في تحويل ملف الداتا بيز إلي
الكود التالي مأخوذ من موقع مايكروسوفت و أنا فقط أعدت صياغته و يمكن إستخدامه في تحويل ملف الداتا بيز إلي
DataTable
Friend Function GetData(sqlCommand As String, connectionString As String) As DataTable
Dim table As DataTable = CType(Nothing, DataTable)
Using conn As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(connectionString)
Dim command As New System.Data.SqlClient.SqlCommand(sqlCommand, conn)
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() {1, 2, 3, 4, 5}
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(keys, names, phones)
End Function
Private Function BuildDataTable(keys As Integer(), names As String(), phones As String()) As DataTable
Dim table As DataTable = CType(Nothing, DataTable)
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 DataTable, passWord As String, filename As String) As Boolean
Using writer As New System.IO.BinaryWriter(System.IO.File.Open(filename, System.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 String, filename As String) As DataTable
Dim table As DataTable = CType(Nothing, DataTable)
If (System.IO.File.Exists(filename)) Then
Using reader As New System.IO.BinaryReader(System.IO.File.Open(filename, System.IO.FileMode.Open), New System.Text.UTF8Encoding(False, False))
' 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
Post a Comment