مشكلات شائعة عند التعامل مع جداول أو الاستعلامات باستخدام الاتصال ado
#1
السلام عليكم ورحمة الله

في هذا الموضوع سنتعرض إن شاء الله لبعض المشكلات الشائعة عند التعامل مع جداول أو الاستعلامات باستخدام الاتصال ADO

في جل هذه المحاولات سنستخدم البراميترات الديناميكية ADO وهو محور هذا الموضوع:
Properties-Dynamic ADO
PHP كود :
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680834%28v=vs.85%29.aspx 

الإشكال الأول: رسالة الخطأ عند محاولة التعديل على بيانات تم تعديلها منذ آخر قراءة
رسالة الخطأ (إنجليزي): Row cannot be located for updating. Some values may have been chenged since it was last read
رسالة الخطأ (فرنسي): La ligne n'a pas pu être trouvée pour la mise à jour. Certaines valeurs ont peut-être changé depuis leur dernière lecture.
السبب: في الواقع هناك عدة أعراض تؤدي إلى حدوث هذا الخلل، تلخصها عبارة: محاولة تعديل بيانات تم تعديلها منذ آخر قراءة، من أمثلة ذلك: التعامل مع حقول الترقيم التلقائي AutoNum، حقول محسوبة على مستوى قاعدة البيانات Computed Column، حقل يحمل قيمة افتراضية Default Value ، استخدام Trigger ربما !
الحل: قد تجد في بعض المراجع/المنتديات حلا باستخدام إعادة استرجاع البيانات Refresh أو شيئا مثل ذلك
غير أن معظم هذه الحلول قد تأثر على سرعة التجاوب مع المستخدم خاصة مع جداول كبيرة نسبيا.
الحل باستخدام برامتر Update Resync بتغيير سلوك التعديل على الجدول، هل يتبع بإعادة التزامن Resync أم لا وعلى أي نطاق؟
مثال:
لدي جدول يحتوي حقل يحمل قيمة افتراضية
عند إضافة سجل Record في هذا الجدول لن أشاهد هذه القيمة، وإذا حاولت تعديلها سأحصل على رسالة الخطأ
البعض يحاول عمل Requery/Refresh لكن الجدول كبير مما قد يؤثر على الكفاءة، إذن Refresh للسطر الحالي
Recordset.Resync(adAffectCurrent, adResyncAllValues)
قد يعمل في بعض الحالات، لكنه يؤدي إلى مزالق أخرى...

الحل -من الأحسن- أن نخبر ADO بإعادة جلب البيانات عند كل: تعديل/إضافة/تغير قيمة الحقل التلقائي:
PHP كود :
procedure TForm1.ADODataSet1AfterOpen(DataSet: TDataSet);
begin
  TCustomADODataSet
(DataSet).Properties['Update Resync'].Value :=
    
adResyncAutoIncrement + adResyncUpdates + adResyncInserts;
end; 
ملاحظات:
القيمة الافتراضية للبرامتر Update Resync هي adResyncAutoIncrement فقط.
الحدث المناسب هنا عند فتح الجدول OnAfterOpen.
هذه الطريقة تعمل فقط على وضع الاتصال: CursorLocation := clUseClient

في المرفق الأول مثال حقول يحمل قيمة افتراضية في جدول Access 2007 وصالح مع حقول حسابي Computed Column على SQL Server.
يتبع...


الملفات المرفقة
.rar   ComputedColumn.rar (الحجم : 11.91 ك ب / التحميلات : 358)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد


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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم