تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تحديث قاعدة البيانات باستخدام الأسلوب update و الحدث rowUpdated الخاصdata adapter
#1
كاتب الموضوع : egyption-coder

التحميل الزائد على السيرفر.........بطىء الأضافة و التعديل و الحذف من قاعدة البيانات.........التحميل الزائد على قاعدة البيانات

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

و لكى نتمكن من ذلك لابد ان نعرف حالات الكائن data row

الحالة added و فيها يتم اضافة الصف الى الداتا تيبل و لكن لم يضاف بعد الى قاعدة البيانات
الحالة deleted و فيها يتم الغاء الصف و لكن لم يتم حذفه بعد من الداتابيز
الحالة modified وفيها يتم تعديل الصف و لكن ليس فى الداتا بيز
الحالة detached و فيها يتم انشاء الصف و لكنه لم يضاف حتى الى الداتا تيبل
الحالة unchanged لا يوجد تغيير فى الصف
و تستخدم هذه الحالات عندما نستدعى الأسلوب update الخاص بالكائن dataAdapter

و هذا الأسلوب هو الذى تستخدمه اداة معالجة البيانات dataForm لكى تحدث قاعدة البيانات
باستخدان الدالة UpdateDataSource
انظر الكود



كود :
Public Function UpdateDataSource(ByVal dataSet As EditProducts.DSProducts) _
As System.Int32
Me.OleDbConnection1.Open()
Dim UpdatedRows As System.Data.DataSet
Dim InsertedRows As System.Data.DataSet
Dim DeletedRows As System.Data.DataSet
Dim AffectedRows As Integer = 0
UpdatedRows = DataSet.GetChanges(System.Data.DataRowState.Modified)
InsertedRows = DataSet.GetChanges(System.Data.DataRowState.Added)
DeletedRows = DataSet.GetChanges(System.Data.DataRowState.Deleted)
Try
If (Not (UpdatedRows) Is Nothing) Then
AffectedRows = OleDbDataAdapter1.Update(UpdatedRows)
AffectedRows = (AffectedRows + OleDbDataAdapter2.Update(UpdatedRows))
AffectedRows = (AffectedRows + OleDbDataAdapter3.Update(UpdatedRows))
End If
If (Not (InsertedRows) Is Nothing) Then
AffectedRows = (AffectedRows + OleDbDataAdapter1.Update(InsertedRows))
AffectedRows = (AffectedRows + OleDbDataAdapter2.Update(InsertedRows))
AffectedRows = (AffectedRows + OleDbDataAdapter3.Update(InsertedRows))
End If
If (Not (DeletedRows) Is Nothing) Then
AffectedRows = (AffectedRows + OleDbDataAdapter1.Update(DeletedRows))
AffectedRows = (AffectedRows + OleDbDataAdapter2.Update(DeletedRows))
AffectedRows = (AffectedRows + OleDbDataAdapter3.Update(DeletedRows))
End If
Catch updateException As System.Exception
Throw updateException
Finally
Me.OleDbConnection1.Close()
End Try
End Function
هل لاحظت ما فعلناه هنا
لقد قامت الدالة بأنشاء ثلاث كائنات داتا سيت جديدة و ملأتها بالصفوف التى تم اضافتها و حذفها و تعديلها على الترتيب ثم قامت بعد ذلك بأستدعاة الأسلوب ابدايت للداتا ادابتر و تحديث قاعدة البيانات من هذه الداتا سيت التى تحتوى على الصفوف المعدلة فقط

هذا جميل جدا ولكن

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

و لكن هناك حل يلجأ اليه بعض المبرمجين و هو ضبط خاصية continueUpdateOnError على true

و هذا حل خطير اذ انك لن تعرف ابدا اذ ما كانت بعض الصفوف تم رفضها ولكن على اى حال فأنت مجبر ان تقبل هذا الأختيار

و الحل المثالى ان تقوم بمعالجة الأمر بالكود

و ذلك بفحص خاصية error لكل صف يتم تحديثه و كذلك فحص خاصية e.staus للعملية الجارية و اذا ما فشلت العملية الخاصة بتحديث الصف فستتحول الخاصية المذكورة الى UpdateStatus.ErrorOccured و يمكنك عندها التعامل مع الخطأ كما تشاء

و الأن مع الكود

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


كود :
Private Sub UpdateTable(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles bttnUpdate.Click
If Not DsProducts1.GetChanges(DataRowState.Modified) Is Nothing Then _
SqlDataAdapter1.Update(DsProducts1.GetChanges(DataRowState.Modified))
If Not DsProducts1.GetChanges(DataRowState.Added) Is Nothing Then _
SqlDataAdapter1.Update(DsProducts1.GetChanges(DataRowState.Added))
If Not DsProducts1.GetChanges(DataRowState.Deleted) Is Nothing Then _
SqlDataAdapter1.Update(DsProducts1.GetChanges(DataRowState.Deleted))
End Sub
و الأن نتعامل مع الحدث RowUPDATED الخاص بـ DataAdapter


كود :
Handling the DataAdapter’s RowUpdated Event
Private Sub SqlDataAdapter1_RowUpdated(ByVal sender As Object, _
ByVal e As System.Data.SqlClient.SqlRowUpdatedEventArgs) _
Handles SqlDataAdapter1.RowUpdated
Select Case e.Row.RowState
Case DataRowState.Added
Console.Write(“Adding Product ID = “ & _
e.Row.Item(“ProductID”, ataRowVersion.Proposed))
Case DataRowState.Deleted
Console.Write(“Deleting Product ID = “ & _
e.Row.Item(“ProductID”, DataRowVersion.Original))
Case DataRowState.Modified
Console.Write(“Updating Product ID = “ & _
e.Row.Item(“ProductID”, DataRowVersion.Original))
End Select
If e.Status = UpdateStatus.ErrorsOccurred Then
Console.WriteLine(“Failed to update row “)
Console.WriteLine(e.Errors.Message)
e.Row.RejectChanges()
Else
Console.WriteLine(“ Updated successfully”)
e.Row.AcceptChanges()
End If
End Sub
لاحظ اننا نحدد الصف الذى تم تحديثه من خلال e.row و حالة الصف من خلال e.row.rowState
و من ثم نعرض نوع الأجراء(حذف تعديل اضافة)
ثم نفحص e.status و التى يتم ضبطها على UpdateStatus.ErrorOccured اذا اخفقت العملية و عندها نظهر رسالة الخطأ او نتعامل معه
و ارجو فى النهاية ان اكون وفقت فى عرض الموضوع
و الأهم ان يدرك الأخوة اهميته خاصة عندما يصبح حجم البيانات بمئات الألاف او الملايين من الصفوف بينما ما يتم تعديله بضع مئات فقط
و جزاكم الله خيرا
}}}}
تم الشكر بواسطة: nabil1982


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [شرح] اتصال بقاعدة بيانات اكسيس , اضافة بيان , تعديل بيان , حذف بيان , عرض البيانات . ahmed salam 20 9,057 26-09-16, 08:12 AM
آخر رد: abumuhannadzym
  اصنع محرر أكواد خاص بك باستخدام الأداة RichTextBox السكر المغرور 8 1,524 03-09-16, 07:59 PM
آخر رد: tryold
  [كود] استرجاع البيانات من ConnectionString silverlight 1 291 25-01-16, 05:08 PM
آخر رد: khodor1985
  [درس فيديو] حل مشكلة صلاحيات قواعد البيانات عند تغيير مسارها على الجهاز Operating System Error 5 أحمد النجار 1 414 31-12-15, 02:52 AM
آخر رد: WAEL ABED
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 538 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد
  [VB.NET] العمل على تحديث الداتا غريد فيو العواد الصغير 0 376 27-07-15, 10:19 PM
آخر رد: العواد الصغير
  [VB.NET] التشفير باستخدام خوارزمية rsa alking-0999 10 1,333 08-07-15, 04:24 PM
آخر رد: مبرمج بلا حدود
  فيديو بالعربي تبادل البيانات بين Excel و VB.net أحمد النجار 0 550 03-06-15, 10:53 PM
آخر رد: أحمد النجار
  [VB.NET] كيفية انشاء قاعدة بيانات برمجيا VB.net (صوت وصورة) أحمد النجار 0 725 18-01-15, 06:59 AM
آخر رد: أحمد النجار
  برمجة قواعد البيانات sql server + vb.net ابوهديل 1 5,823 13-02-14, 08:26 PM
آخر رد: Omar Mekkawy

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


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