31-01-16, 12:37 AM
السلام عليكم ورحمة الله وبركاته
شئ مهم جدا أن نعرف كيف نبني نسخة إحتياطية من ملفات الداتا بيز ثم نحتفظ بها في مكان ما و تسترجعها عندما يحدث خلل ما في النسخة الاصلية
الفكرة
الفكرة المستخدمة يمكن تقسيمها الي ثلاثة مراحل كالتالي
المرحلة الأولي
إسترجاع البيانات الموجودة في الداتا بيز علي شكل جدول DataTable تحديدا
لماذا نستخدم DataTable Class ..... لأن هذا الكلاس و بشكل عام يمثل واحدا من أهم همزات الوصل بين كل من الداتا بيز و واجهة التطبيق الخاصة بالبرنامج
المرحلة الثانية
حفظ البيانات الموجودة في DataTable في ملف باستخدام BinarWriter
المرحلة الثالثة
إسترجاع البيانات من الملف علي شكل DataTable و ذلك باستخدام BinaryReader
توضيح
أول مشكلة ربما تواجهنا في كتابة الكود هي صعوبة تعميم الكود حيث أن كل مبرمج قد يعطي إسما مختلفا لكل عمود في الداتا بيز و بما أنه لا يوجد هناك قوانين ثابتة لتسمية الأعمدة في الداتا بيز أو في DataTable فكان صعب جدا تعميم الكود ليقرأ كل الأعمدة سواء من الداتا بيز او من DataTable
ثاني مشكلة سوف تواجهنا هي نوعية البيانات المستخدمة في كل عمود فهي قد تختلف طبقا لإحتياجات كل مبرمج أو طبقا لنوعية المتغيرات التي يتم تخزينها فبعض المبرمجين قد يخزن المعلومات في شكل تكست او في شكل تاريخ او في شكل رقم ..... الي أخره لذلك وهنا أيضا تأتي صعوبة تعميم الكود
عموما وكبداية سأوضح كيف نفعل هذا مع قاعدة بيانات بها بعض الأعمدة من النوع String وهنا أنا أفترض أن من يقرأ هذا الموضوع لديه قاعدة بيانات بها بعضا من الأعمدة و مدخلاتها عبارة عن String
الكود
المرحلة الأولي
تحويل بعضا من البيانات الموجودة في الداتابيز إلي DataTable
الكود التالي مأخوذ من موقع مايكروسوفت و أنا فقط أعدت صياغته و يمكن إستخدامه في تحويل ملف الداتا بيز إلي DataTable
و بما أنني ليس لدي SQL و أيضا ليس لدي MS Access لذلك و لتفادي الخطأ في تنفيذ بقية الكود لذلك سوف أبني DataTable بسيط و أستخدمه و الكود التالي يوضح ذلك
المرحلة الثانية
حفظ البيانات في ملف
و الكود التالي يوضح ذلك و ما يهمني توضيحه هنا هو أن عملية حفظ البيانات في الملف يجب ان تتم بترتيب مناسب حيث أن هذا الترتيب سيتم إستخدامه في إسترجاع البيانات من الملف لاحقا
مثلا لو أردنا أن نحفظ عدد الأعمده ثم نحفظ أسماء الأعمده ..... و هكذا
يجب أن يتم إسترجاع البيانات بنفس الترتيب
المرحلة الثالثة
إسترجاع البيانات من الملف
و عملية إسترجاع البيانات تتم بنفس ترتيب عملية حفظ البيانات
و الكود التالي يوضح ذلك
بشكل عام الكود سهل و بسيط و يمكن تطويره للإستخدام بأكثر من أسلوب
و في المرفقات ستجدون بقية الكود و كيفية استخدامه
الكود مكتوب بنسخة الفيجوال اسنوديو 2015
تقبلوا تحياتي
شئ مهم جدا أن نعرف كيف نبني نسخة إحتياطية من ملفات الداتا بيز ثم نحتفظ بها في مكان ما و تسترجعها عندما يحدث خلل ما في النسخة الاصلية
الفكرة
الفكرة المستخدمة يمكن تقسيمها الي ثلاثة مراحل كالتالي
المرحلة الأولي
إسترجاع البيانات الموجودة في الداتا بيز علي شكل جدول DataTable تحديدا
لماذا نستخدم DataTable Class ..... لأن هذا الكلاس و بشكل عام يمثل واحدا من أهم همزات الوصل بين كل من الداتا بيز و واجهة التطبيق الخاصة بالبرنامج
المرحلة الثانية
حفظ البيانات الموجودة في DataTable في ملف باستخدام BinarWriter
المرحلة الثالثة
إسترجاع البيانات من الملف علي شكل DataTable و ذلك باستخدام BinaryReader
توضيح
أول مشكلة ربما تواجهنا في كتابة الكود هي صعوبة تعميم الكود حيث أن كل مبرمج قد يعطي إسما مختلفا لكل عمود في الداتا بيز و بما أنه لا يوجد هناك قوانين ثابتة لتسمية الأعمدة في الداتا بيز أو في DataTable فكان صعب جدا تعميم الكود ليقرأ كل الأعمدة سواء من الداتا بيز او من DataTable
ثاني مشكلة سوف تواجهنا هي نوعية البيانات المستخدمة في كل عمود فهي قد تختلف طبقا لإحتياجات كل مبرمج أو طبقا لنوعية المتغيرات التي يتم تخزينها فبعض المبرمجين قد يخزن المعلومات في شكل تكست او في شكل تاريخ او في شكل رقم ..... الي أخره لذلك وهنا أيضا تأتي صعوبة تعميم الكود
عموما وكبداية سأوضح كيف نفعل هذا مع قاعدة بيانات بها بعض الأعمدة من النوع String وهنا أنا أفترض أن من يقرأ هذا الموضوع لديه قاعدة بيانات بها بعضا من الأعمدة و مدخلاتها عبارة عن String
الكود
المرحلة الأولي
تحويل بعضا من البيانات الموجودة في الداتابيز إلي DataTable
الكود التالي مأخوذ من موقع مايكروسوفت و أنا فقط أعدت صياغته و يمكن إستخدامه في تحويل ملف الداتا بيز إلي DataTable
PHP كود :
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
PHP كود :
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
المرحلة الثانية
حفظ البيانات في ملف
و الكود التالي يوضح ذلك و ما يهمني توضيحه هنا هو أن عملية حفظ البيانات في الملف يجب ان تتم بترتيب مناسب حيث أن هذا الترتيب سيتم إستخدامه في إسترجاع البيانات من الملف لاحقا
مثلا لو أردنا أن نحفظ عدد الأعمده ثم نحفظ أسماء الأعمده ..... و هكذا
يجب أن يتم إسترجاع البيانات بنفس الترتيب
PHP كود :
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
المرحلة الثالثة
إسترجاع البيانات من الملف
و عملية إسترجاع البيانات تتم بنفس ترتيب عملية حفظ البيانات
و الكود التالي يوضح ذلك
PHP كود :
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
بشكل عام الكود سهل و بسيط و يمكن تطويره للإستخدام بأكثر من أسلوب
و في المرفقات ستجدون بقية الكود و كيفية استخدامه
الكود مكتوب بنسخة الفيجوال اسنوديو 2015
تقبلوا تحياتي