PDA

View Full Version : چگونه از ایجاد خطای تولید مقدار کلید اصلی تکراری در دو مکان مختلف توسط دو کاربر متفاوت جلوگیری کنیم؟



mahdimahdi58
دوشنبه 24 مرداد 1390, 00:57 صبح
با سلام
من با سی شارپ برنامه می نویسم و بانک اطلاعاتم اس کیو ال هست. یه جدول اصلی A با کلید اصل id دارم. دو نفر در دو مکان مجزا روی یک دیتابیس و در جدول A یک مقدار به کلید id اختصاص میدن. مثلا id نام گروه کالا باشه. و دو کاربر دارن یک گروه کالا با نام "غلات" رو با هم ایجاد می کنن.
صفحه فرم ایجاد این گروه کالا، چون در ابتدا آفلاین هست نمی تونه این همزمانی رو چک کنه و هر کدوم که دومین نفر در ثبت نام کالا باشه با یک خطا روبرو میشه. آیا راهی هست که از این خطا جلوگیری کنه؟

در نتیجه:
اگه جدول B با کلید خارجی id داشته باشیم که با جدول A (تعریف شده در بالا) ارتباط داشته باشه و به صورت آفلاین فیلد id جدول A با نام "غلات" رو ایجاد کنیم. حالا ردیفی در جدول B مربوط به مثلا "گندم" رو بنویسیم که جزء گروه "غلات" هست. و یک کاربر دیگه ای هم همین کار رو بکنه، به محض ذخیره اطلاعات توسط کاربر اول، کاربر دوم با خطا مواجه میشه که باعث به هم ریختن اطلاعاتش میشه.
چطور از ایجاد این خطاها جلوگیری کنیم؟

Galawij
دوشنبه 24 مرداد 1390, 08:35 صبح
سلام.
دستورات Insert را داخل یک TRANSACTION قراربدید، تا درصورتی که این مقدار قبلاً در بانک اطلاعاتی وجود دارد به کاربر پیغامی مبنی بر موجود بودن داده مورد نظر، داده شود.

mahdimahdi58
دوشنبه 24 مرداد 1390, 11:03 صبح
با سلام و تشکر از توجه حضرتعالی
مشکل ما اینجاست که هر وقت توی یک فرم جداول تو در تو رو مقدار دهی کنیم؛ اگه کلید اصلی اولین جدول خطا بده و بخواهیم مقدارش رو عوض کنیم، اگه مقادیر جداول زیر مجموعه رو نوشته باشیم، چون مقدار کلید اصلیشون رو تغییر میدیم، مقادیر داخل فرم رو که نوشته بودیم پاک میشه. چون به مقدار کلید خارجی جدیدی اشاره دارن.
- اول اینکه اگه تعداد جداول تو در تو زیاد باشن نمیشه برای مقدار دادن هر کلیدی یک فرم طراحی کنیم، چون تعداد فرمهامون خیلی میشن.
-دوم اینکه اگه تعداد جداول تو در تو زیاد باشن، با تغییر اولین کلید خارجی، چون مقادیر اشاره شده جداول تو در تو تغییر می کنه، مقادیر نوشته شده برای جداول داخلی حذف میشن.

Ali_M_K
شنبه 28 مرداد 1391, 11:03 صبح
من در مورد جدولی که sql بصورت خودکار به اون مقدار کلید اصلی رو میده چنین مشکلی دارم
فک میکنم این مشکل رو خود sql باید مدیریت کنه اما من در برنامه ام این مشکل رو دارم. یعنی وقتی کاربر فرم رو پر میکنه و دکمه اینسرت رو میزنه گه گاهی پیام خطا میگیرم که id با شماره فلان موجود است.
اینو باید چکار کرد؟

baktash.n81@gmail.com
سه شنبه 31 مرداد 1391, 10:01 صبح
بینید شما می تونید کلیدتون رو از نوع Identity تعریف کنید ... اونوقت SQL خودش مقدار دهی به اون رو مدیریت می کنه و شما هیچ وقت پیغام خطای کلید تکراری رو دریافت نخواهید کرد ...

در مورد پست 3 ... اگه شما تو برنامتون مرتب مقدار کلید اصلی یک رکورد رو تغییر میدید ... حتما طراحیتون مشکل داره ... تا اونجایی که می شه از Update فیلدهای کلیدی اجتناب کنید ... در هر صورت برای جداول فرزند می تونید Relation تعریف کنید و از امکان Cacade استفاده کنید