این خطا موقعی روی میده که روی Dataset عملیات Update یا Delete صورت بگیره.
فرض کنیم شما یک جدول داشته باشید به اسم Tableبا ساختار زیر:
1- PrimaryKey
2- Filed1
3- Filed2
اگر شما مقدار Field 1 رو تغییر بدید، ADO کد SQL شبیه به این تولید میکنه:
UPDATE Table SET Filed1="New Value" WHERE PrimaryKey="Some Value" AND Field1="Previous Value"
این کد وابسته به مقدار قبلی Field1 هست. اگر قبل از ثبت این تغییرات برنامه یا کاربر و یا کاربران دیگه مقدار این فیلد رو به چیز دیگه ای تغییر بدند (مثلا "Previous Value" رو به "Some other Value" تغییر بدند، دستور العمل بالا نمیتونه رکورد مورد نظر رو پیدا کنه. در نتیجه رکوردی Update یا Delete نمیشه و خطای بالا ظاهر میشه.
برای جلوگیری از خطای بالا می تونید یکی از دو کار زیر رو انجام بدید:
1- خاصیت LockType دیتا ست رو به ltPessimistic تغییر بدید. در این صورت رکورد مورد نظر قفل میشه و امکان تغییر در آن توسط کاربران دیگه وجود نخواهد داشت.
2- ADOQuery1.Properties['Update Criteria'].Value := 0; //adCriteriaKey
;
با استفاده از کد بالا، ADO در هنگام update ، رکورد رو فقط از طریق PrimaryKey پیدا میکنه و شرط Field1="Previous Value رو لحاظ نمیکنه. در این حالت فقط در صورتی پیغام خطای بالا داد میشه که PrimaryKey همزمان توسط دو کاربر تغییر داده بشه.