PDA

View Full Version : خطا هنگام آپدیت کردن آداپتر در شبکه



Mrs.Net
چهارشنبه 09 آبان 1386, 13:06 عصر
یک سیستم دارم که چندکاربر همزمان با اون کار میکنند با یک بانک اکسس در سرور
یک تیبل به یک دیتاگرید بایند کردم و تغییرات اون با ()dataadapter.update آپدیت میکنم.
وقتی دو کاربر همزمان یک کورد تغییر میدن و یکی زودتر آپدیت میکنه
برای نفر دوم خطا میده و میگه رکوردی آپدیت نشد
چجوری جلوی این خطا رو بگیرم؟

hdv212
چهارشنبه 09 آبان 1386, 16:16 عصر
برای نفر دوم خطا میده و میگه رکوردی آپدیت نشد
این پیغام رو احتمالا خودتون تنظیم کردید، باید ببینید Exception اصلی و پیامش چیه، احتمالا باید Connection اون user اولی بسته بشه یا تغییراتش Commit بشه تا رکورد مورد نظر از حالت lock شده خارج بشه، احتمالات زیادی وجود داره باید دقیقا پیغام خطا رو بررسی کرد، (منظورم پیغام خطای اصلی برنامه س نه پیغامی که شما براش تنظیم کردید)

Mrs.Net
پنج شنبه 10 آبان 1386, 00:20 صبح
نه من ترجمه پیغامی که میده گفتم:


Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.

ولی فکر میکنم با آپدیت کردن کاربر اول دیگه ایم رکورد از حالت آماده برای آپدیت خارج میشه و آپدیت دوم دگه رکوردی ندار آپدیت کنه!

mehdi.mousavi
پنج شنبه 10 آبان 1386, 00:40 صبح
یک سیستم دارم که چندکاربر همزمان با اون کار میکنند با یک بانک اکسس در سرور
یک تیبل به یک دیتاگرید بایند کردم و تغییرات اون با ()dataadapter.update آپدیت میکنم.
وقتی دو کاربر همزمان یک کورد تغییر میدن و یکی زودتر آپدیت میکنه
برای نفر دوم خطا میده و میگه رکوردی آپدیت نشد
چجوری جلوی این خطا رو بگیرم؟


سلام.
به این مساله میگن Concurrency Control! یعنی دو یا چند کاربر با هم دیگه یک رکورد رو از سرور میگیرن، بعد شروع میکنن به update کردن. اونوقت یه کاربر میره و رکورد رو Save میکنه. موقع ذخیره رکورد، شما تو SQL ای که نوشتید گفتید که فقط در صورتی Update کن، که فیلدهای فعلی در بانک با فیلدهایی که نسخه Original اشون دست کاربر اوله، یکی باشن. چون واسه نفر اول یکی هستش، مشکلی پیش نمیاد.

اما وقتی نفر دوم داره میره Update کنه، دستور Update نمیتونه رکوردی رو پیدا کنه که با رکورد نسخه Original نفر دوم یکی باشه، چون در حال حاضر نفر اول اونا رو تغییر داده. در نتیجه RecordsAffected مربوط به دستور Update نفر دوم، صفر میشه و شما اون Error رو میگیرید.

روشی که شما میخواهید برای Concurrency Control، بهش میگن Last In Wins. یعنی هر کی آخرین رکورد رو بنویسه، اون برنده است! تو مثال ما، اطلاعات نفر اول بدون هیج هشداری از بین خواهد رفت. برای این منظور کافی هستش تا شرط Update رو تغییر بدید و دیگه هر رکورد رو با رکورد Original مقایسه نکنید.