تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] رسالة خطأ عند الحذف أو تعديل بيانات جديدة #concurrency violation#
#9
قبل ان اقوم بالاطلاع على المرفق
تعال نتحدث قليلاً لما هو لديك فى الكود من مشكلة

انت الان قمت بعمل الاستعلام لتعبئة الداتا جريد
والى هنا جميل ولا يوجد مشكلة

ولكن المشكلة تقع فى قيمة الكمية فتعال نتخيلها ان الكمية 100
عند عمل الاستعلام عند المستخدم الاول
فاتا الشخص الثاني قام بفتح نفس الشاشة واصبح الكمية لديه 100 ايضاً

طيب تعال نقول ان المستخدم الثاني قام بتحديث الكمية واصبح الكمية لديه بعد التحديث 90
السؤال هنا واللى هو نقطة مهمة جداً جداً جداً تعتقد ان الكمية خاصة الـ 90 من المستخدم الثاني
سمعت عن المستخدم الاول اللى كانت عنده 100 حتى فتح الشاشة

كا قاعدة بيانات ايوة سمعت ولكن على الشاشة
وفى قيمة dttt لا وهى 100 حتى هذه اللحظة

ايه ده يعنى لو المستخدم الاول عمل تحديث الان على الكمية لينقص 20
بدل ما تكون القيمة 70 هتصبح 80

بكل تاكيد لان عند عملية التحديث تتم من خلال DataTable وليس من خلال كود
كالاستعلام لتحديث بقاعدة البيانات

طيب الحل هنا ايه

الحل هو بدلاً من استخدام هذا الجزؤ كما توقعت وشرحت بالاعلى بعد فتح المرفق
كود :
           daaa = New OleDbDataAdapter("select * from TABLE_STOCK_FINAL WHERE Code = '" & dt1.Rows(i).Item("Code") & "'     ", cn)
           daaa.Fill(dttt)

ان تجعله كود 
PHP كود :
update query 

يتم الامر ازاي بناءاً على المرفق
انظر داخل حلقة For فى كود زر الحفظ 

وقم بمسح الكود التالى
كود :
           Dim dttt As New DataTable
           Dim daaa As New OleDbDataAdapter
           dttt.Clear()

           daaa = New OleDbDataAdapter("select * from TABLE_STOCK_FINAL WHERE Code = '" & dt1.Rows(i).Item("Code") & "'     ", cn)
           daaa.Fill(dttt)


           If dttt.Rows.Count <> 0 Then

               dttt.Rows(0).Item("Qté") = dttt.Rows(0).Item("Qté") - DataGridView1.Rows(i).Cells("Qté").Value

               Dim save As New OleDbCommandBuilder(daaa)
               daaa.Update(dttt)
               dttt.AcceptChanges()

           End If

واستبدله بهذا الكود ليكون بدل ما تم مسحه
كود :
           ' Start Update To Database
           If Not cn.State = ConnectionState.Open Then
               cn.Open()
           End If
           Dim sqlins As String = "UPDATE TABLE_STOCK_FINAL SET Qté = Qté - " & DataGridView1.Rows(i).Cells("Qté").Value & " WHERE Code = '" & DataGridView1.Rows(i).Cells("Code").Value & "'"
           Using cmd As New OleDbCommand(sqlins, cn)
               cmd.ExecuteNonQuery()
           End Using
           cn.Close()
           ' End Add To Database

وبكدة سيتم حل المشكلة تماماً بامر الله
وسيصبح قاعدة بيانات Access كما لو انها Sql فى التعامل  Big Grin

الان للنقطة الاخيرة
إقتباس :بالنسبة للأعضاؤ الذين يستخدمون SQLSERVER أو MYSQL
لماذا لا يوجد لديهم هده المشاكل في الشبكة
يعني ما الفرقي الجوهري بينهم و بين ACCES  في التعديل و الحدف

طبعاً يوجد فارق كبير جداً بين Access  و Sql
قاعدة بيانات Access
هى للعوامل الفردية الصغيرة ولهذا لم تخصص للتعامل عبر الشبكات 
والطريقة لجعلها كذلك هو فى الموضوع لشرحى كيف التعامل مع Access خلال الشبكة
بينما Sql من اى نوع فهو للتعامل مع الاحجام المتوسطة ولاكثر من 5 افراد فاكثر
طبعاً يوجد قواعد بيانات اضخم ولا نحتاج للنقاش عنها هنا

يمكنك الان اختبارا الكود
وابشر بان اصبح الامر معك افضل من الاول
وان تكون الصورة وضحت لديك كاملاً

وعفواً انا كنت قصرت لكونى لم اطلع على المرفق كاملاً
خلاف نقطة كود الحفظ سريعاً بسبب ضيق الوقت فقط

فسامحنى على ذلك

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد }}}
تم الشكر بواسطة: sniperjawadino , sniperjawadino , sendbad100


الردود في هذا الموضوع
RE: رسالة خطأ عند الحذف أو تعديل بيانات جديدة #concurrency violation# - بواسطة elgokr - 16-05-19, 03:11 PM


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


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