PDA

View Full Version : مشکل در ورود اطلاعات به پایگاه داده در برنامه



mehrab1387
شنبه 21 اسفند 1389, 22:07 عصر
من وقتی از کلید اصلی در یک جدول در پایگاه استفاده میکنم ومی خواهم اطلاعات را در این جدول وارد کنم،مطمئنا اگر کلید اصلی تکراری باشد،خطا میدهد و برنامه بسته میشود
در اینگونه موارد باید چه کار کرد؟
در برنامه ها ی حرفه ای چگونه با این مسائل برخورد میشود؟
آیا باید از try و catchاستفاده کرد یا راه های دیگری نیز هست؟
اگر قرار باشد اول جستجو کنم و بعد اگر تکراری نبود اطلاعات را وارد کنم پس تعریف کلید اصلی به چه دردی میخورد؟

حمیدرضاصادقیان
یک شنبه 22 اسفند 1389, 08:39 صبح
سلام.
خوب شما دوره پیش رو دارید. یکی اینکه اجازه بدید کاربر هر اطلاعاتی میخواد ثبت کنه بعد در داخل برنامه با استفاده از Try-Catch کنترل کنید که اگر پیغام رکورد تکراری داد شما خطای مورد نظرتون رو به کاربر نمایش بدید.
یک راه دیگه این هست که خودتون آخرین رکورد رو پیدا کنید و اجازه ندید کاربر اطلاعات تکراری رو وارد کنه و خودتون همیشه مقدار جدید رو بهش بدید.
در برنامه های حرفه ای شما باید از خطای کاربر جلوگیری کنید. نباید دست کاربر رو باز بذارید که برنامه دچار مشکل بشه. همیشه باید سعی کنید جاهایی هم که احتمال بروز خطا میدهید داخل بلوک Try-Catch قرار بدید تا برنامه تون از لحاظ پایداری به سطح بالایی برسه.

m_omrani
دوشنبه 23 اسفند 1389, 07:35 صبح
پيش بيني آخرين مقدار کليد بر اساس آخرين رکورد درج شده در حالتي که کليد از جزء يا اجزائي تشکيل مي شه که هنگام درج رکورد جديد، کاربر بايد مقدار اونها رو مشخص کنه ميسر نيست. به عنوان مثال فرض کنيد در جدول محصول کُد محصول که به صورت دستي توسط خود کاربر وارد مي شه، کليد باشه.

لذا به نظر من بهترين راه اينه که قبل از درج رکورد يه بار با IF EXISTS چک کنيد که آيا رکوردي با کليد مورد نظر قبلاً وجود داره يا نه. اگه وجود داشت از درج رکورد خودداري کنيد. اين طوري Exception هم توليد نمي شه که مجبور بشيد با Try-Catch هندلش کنيد. از اونجايي که جستجو روي کليد اصلي انجام مي شه که يعني Clustered Index داره، لذا Index Seek انجام مي شه و از لحاظ سرعت يا کارايي هم به مشکلي برخورد نمي کنيد.

مثال:


if not exists(select 1 from mytable where pk = @pk)
insert into mytable ...
else
-- record already exists

ASKaffash
دوشنبه 23 اسفند 1389, 10:05 صبح
پيش بيني آخرين مقدار کليد بر اساس آخرين رکورد درج شده در حالتي که کليد از جزء يا اجزائي تشکيل مي شه که هنگام درج رکورد جديد، کاربر بايد مقدار اونها رو مشخص کنه ميسر نيست. به عنوان مثال فرض کنيد در جدول محصول کُد محصول که به صورت دستي توسط خود کاربر وارد مي شه، کليد باشه.

لذا به نظر من بهترين راه اينه که قبل از درج رکورد يه بار با IF EXISTS چک کنيد که آيا رکوردي با کليد مورد نظر قبلاً وجود داره يا نه. اگه وجود داشت از درج رکورد خودداري کنيد. اين طوري Exception هم توليد نمي شه که مجبور بشيد با Try-Catch هندلش کنيد. از اونجايي که جستجو روي کليد اصلي انجام مي شه که يعني Clustered Index داره، لذا Index Seek انجام مي شه و از لحاظ سرعت يا کارايي هم به مشکلي برخورد نمي کنيد.

مثال:


if not exists(select 1 from mytable where pk = @pk)
insert into mytable ...
else
-- record already exists


سلام
در موارد نادر هم همزمانی اتفاق می افتد روی شبکه چند بار این مشکل را من دیده ام بهترین حالت برای فرار از ریسک همان Try و .. است