دلایل ممکن:- کاربر دیگری بعضی یا تمام فیلدهایی که شما در حال ویرایش آن هستید را ویرایش کرده است.
- پس از Insert اولیه، فیلدها توسط یک Trigger دستکاری شده و شما سعی میکنید قبل از انجام requery رکورد را Update کنید.
- اتفاقی در Client Side افتاده که باعث تغییر یافتن رکورد خوانده شده در حافظه افتاده است و اکنون رکورد در حافظه با آنچه در Database است مطابقت نمیکند. بعنوان مثال بعضی از درایور های اتصال به Database بخش miliseconds فیلدهای TDateTime را از آن حذف میکنند.
حالت پیش فرض در کامپوننتهای ADO بورلند اینستکه موقع ویرایش یک رکورد، مقدار تمام فیلدها را در حافظه میخواند. هنگامی که شما میخواهید مقادیر ویرایش شده را پست کنید ابتدا رکورد نگهداری شده در حافظه در Database جستجو شده و در صورت یافت شدن عمل Update صورت میگیرد. حال اگر در اثر یکی از موارد فوق رکورد در Database یافت نشود شما این پیغام خطا را دریافت میکنید.
این رفتار در کامپوننتهای BDE وجود ندارد. برای وادار کردن کامپوننتهای ADO به انجام اینکار میتوانید به این روش عمل کنید:ADODataSet1.Properties['Update Criteria'].value :=adCriteriaKey;
مقادیر ممکن برای این property عبارتند از:adCriteriaKey, adCriteriaAllCols (BDE's default),
adCriteriaUpdCols (ADO's default) and adCriteriaTimeStamp.
این property بعد از هر requery به حالت اولیه اش برمیگردد (reset میشود)، بنابراین بهترین کار اینستکه آنرا در event های BeforPost و BeforeDelete اجرا کنید.
اطلاعات بیشتر: HOWTO: Control Your Updates in ADO Through "Update Criteria"