PDA

View Full Version : دو یا چند کاربر در یک رکورد مشترک باشند قفل می شود



ali_abbasi22145
شنبه 12 آذر 1384, 13:50 عصر
سلام.
توی برنامم که بانکش از نوع2000 SQL server هست برنامه ام در محیط دلفی 7 است. وقتی دو یا چند کاربر به یک رکورد مشترک می رسند و یا ویرایش می کنند خطا زیر را می دهد و قفل می کند و کاربر باید برنامه را reset کند.

پیغام خطا:

Row can not be located for updating
some values may been changed it was last read

m-khorsandi
شنبه 12 آذر 1384, 16:43 عصر
http://www.barnamenevis.org/forum/showthread.php?t=30186

ali_abbasi22145
یک شنبه 13 آذر 1384, 12:58 عصر
درود
دوست عزیز،
قبل از اینکه ADODataSet رو فعال کنی این کد رو بنویس:

کد:

ADOTable1.Properties['Update Criteria'].Value := adCriteriaKey;

////////////////////////////////////////////////////////////////////////////////////////////////////

صبر کنید دوستمون امتحان کنند اگه مشکل حل شد، توضیح میدم.

/////////////////////////////////////////////////////////////////////////////////////////////////////


چرا مشکلش حل شد شما بفرما.

/////////////////////////////////////////////////////////////////////////////////////////////////////


سه تا پست بالاتر شما همین موضوع رو مطرح کردید و من هم جوابتون رو دادم،
صبر داشته باشید.

//////////////////////////////////////////////////////////////////////////////////////////////////////

دوست عزیز من کار شما را انجام دادم اما با خطای زیر روبرو شدم

Access violation at address 00520AD1 in module 'SchollAccess.exe' ,read of adress 00000000

/////////////////////////////////////////////////////////////////////////////////////////////////////
عذر میخوام،
بعد از فعال کردن جدول میبایست کد رو بگذارید:

کد:

ADOTable1.Active := True;
ADOTable1.Properties['Update Criteria'].Value := adCriteriaKey;

m-khorsandi
////////////////////////////////////////////////////////////////////////////////////////////////

بابا ایول دمت گرم
حالا اگر ممکنه یکم هم توضیح بدهید که چکار میکند این دستور شما البته من بانک اطلاعاتیم Access‌ بود و اصلا هم کاری به شبکه نداشتم و کاملا تک کاربره کار میکردم .

سید مسعود موحد

//////////////////////////////////////////////////////////////////////////////////////////////////

زمانی که از Cursor های ClientSide برای ویرایش اطلاعات توسط ADO استفاده میکنیم، ADO میبایست
که بتونه رکورد مورد نظر رو برای ویرایش در DataBase پیدا کنه.برای انجام این کار ADO به صورت پیش فرض
از مقدار اصلی تمام فیلدها جهت جستجو و مطابقت رکورد مورد نظر استفاده میکنه. اگر حتی یکی از این
فیلدها روی Server تغییر کند، ADO رکورد مورد نظر رو پیدا نمیکنه، در نتیجه پیغامی مبنی بر اینکه رکوردی را
برای Update پیدا نمیکنه نمایش میده.

برای نمونه(همان طور که دوستمون گفتند، زمانی که چند کاربر یک رکورد را ویرایش میکنند) میتونید یک برنامه
کوچک بنویسید که یکی ازفیلدهای اولین رکورد اون رو میخواهیم تغییر بدیم، با اطمینان از اینکه جدول مورد نظر
فعال هست برنامه را اجرا کنید . SQL Server را هم اجرا کنید و جدول مورد نظر را برای ویرایش باز کنید و یکی
از فیلدهای رکورد اول را تغییر بدید ، دکمه Run را فشار دهید. همین کار را برای برنامه ای که نوشتید انجام
دهید، ولی به محض اینکه خط ADODataSet.Post اجرا بشه پیغام خطایی دریافت میکنید.

به صورت پیش فرض مقدار Update Criteria"" برابر با adCriteriaUpdCols هست که با تغییر اون به
adCriteriaKey، ADO فقط کلید اصلی را برای Update جدول در نظر میگیرد.

/////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////
سلام

مشکلم حل نشد و:

1-من کارهای بالا را انجام دادم error زیرا را داشتم:

[Error] Unit1.pas(753): Undeclared identifier: 'adCriteriaKey'

2-این عبارت را بیشتر توضیح دهید: "یونیت ADOInt رو هم Use کنید."

3- "بعد از فعال کردن جدول میبایست کد رو بگذارید" یعنی در کدام رویدداد در Object Insepector ؟

vcldeveloper
دوشنبه 14 آذر 1384, 02:13 صبح
-من کارهای بالا را انجام دادم error زیرا را داشتم:

[Error] Unit1.pas(753): Undeclared identifier: 'adCriteriaKey'
عبارت adCriteriaKey در یونیت AdoInt بصورت adCriteriaKey = $00000000 تعریف شده، شما این یونیت رو به Uses یونیت خودتون اضافه نکردید.

3- "بعد از فعال کردن جدول میبایست کد رو بگذارید" یعنی در کدام رویدداد در Object Insepector ؟
AfterOpen

m-khorsandi
دوشنبه 14 آذر 1384, 07:45 صبح
لینکی که گذاشتم دو صفحه ایست، اگه کامل مطالعه کنید تمام موارد توضیح داده شده.

ali_abbasi22145
دوشنبه 14 آذر 1384, 14:05 عصر
سلام

متشکرم اساتید عزیز

1- البته بلافاصله بعد ارسال این مشکلات بالا من یونیت رو به Uses یونیت خودم اضاه کردم از آن نتیجه گرفتم من کد فوق در رویدداد on create فرم اصلی برنامه ام گذاشتم و کار کرد آیا ممکن است مشکلی پیش بیاید ؟

2-آیا می توان کاری کرد که یک کاربر اگر آن رکورد را تصاحب کرد (زودتر از همه رکورد را باز کرد) به بقییه کاربران که می خواهند آن رکورد را باز کنند فقط یک پیغام هشدار بدهد که کاربر دیگری زودتر این رکورد را در اختیار دارد (نه جلوگیری از کار کردن بر روی آن رکورد انجام دهد).