تقييم الموضوع :
  • 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 , naserflaha71


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
Video [درس فيديو] حل مشكلة تغيير مسار قاعدة البيانات مع تقارير كريستال ريبورت رمضان272 1 2,473 25-10-24, 04:53 AM
آخر رد: رمضان272
  [VB.NET] التحقق من تكرار البيانات بعد الاستيراد من اكسيل loay775 1 541 01-04-24, 06:32 AM
آخر رد: loay775
  رقابة قاعدة البيانات (التحديث التلقائي للبيانات ) SqlDependency قناص المدينة 0 1,149 05-10-23, 04:43 PM
آخر رد: قناص المدينة
  [شرح] اتصال بقاعدة بيانات اكسيس , اضافة بيان , تعديل بيان , حذف بيان , عرض البيانات . ahmed salam 25 41,226 23-02-22, 06:04 PM
آخر رد: رضوان الجماعي
  التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة RaggiTech 3 6,338 30-07-21, 05:14 PM
آخر رد: kebboud
  تنفيذ سكربت القاعدة مع انطلاق البرنامج + تحديث التعديلات على القاعدة ابو ليلى 2 5,576 02-07-21, 09:05 PM
آخر رد: naserflaha71
  دمج قاعدة بيانات SQL Server 2008 مع المشروع بالـ VBNET snipercoder 4 8,642 12-11-20, 06:01 PM
آخر رد: lion4
  [درس فيديو] كيف تحول اي قاعدة بيانات اكسس الى SQL aljzazy 3 3,760 17-04-20, 09:27 PM
آخر رد: الوايلي
  [درس فيديو] كيف تحول اي قاعدة بيانات اكسس الى mysql aljzazy 0 2,573 10-04-20, 09:05 PM
آخر رد: aljzazy
  [VB.NET] كيفية استخدام اداوات ديف اكسبريس devexpressلادخال السجلات الى قاعدة بيانات نوع اكسس 13adam123 0 2,898 29-03-20, 12:50 PM
آخر رد: 13adam123

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


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