PDA

View Full Version : رفع خطا برای فیلدتکراری(فیلدکلید)



emi.cheshmak
دوشنبه 10 بهمن 1390, 00:19 صبح
سلام.
وقتی دیتابیس رو با سی شارپ ارتباط بدیم اگه تو دیتابیس فیلدکلیدی وجود داشته باشه،طبیعتا اگرموقع افزودن داده هامون تو برنامه ای که در سی شارپ نوشتیم، مقداراون فیلد رو تکرار بدیم یه خطای خوشگل میاره!:گیج:
مثلا کد دانشجویی کلید باشه و توی فرم ،تکراری بدیم خطا میاره!
من چه جوری به این بگم که اگه تکراری بود فقط یه msgboxنشون بده!
راستی insert رو هم باprocedureدر sqlنوشتم!
اگر عنوان مناسب نیس معذرت میخوام

zarrinnegar
دوشنبه 10 بهمن 1390, 00:26 صبح
باید قبل از اینکه از Insert استفاده کنی باید یک پروسیجر توی sql بنویسی که یک مقدار مثلا شماره دانشجویی رو بگیره و بعد بگرده توی بانک و اگر بود مثلا false و اگر نبود True رو برگردونه

بعد قبل از insert چک میکنی خروجی این پروسیجر اگر True بود اون وقت بگی که Insert رو اجرا کن

نحوه برگردوندن True ,false توی sql با دستور Return هست
چک کردن رکورد موجود هم

decleare @ted int

set @ted = select Count(*) from person where code=@code
if @ted > 0
return 0

retutn 1

emi.cheshmak
دوشنبه 10 بهمن 1390, 16:44 عصر
گرفتم.
فقط این تیکه رو میشه بگین با چه دستوری بگم تو
procedure

بعد بگرده توی بانک و اگر بود مثلا false و اگر نبود True رو برگردونه
??

returnx
دوشنبه 10 بهمن 1390, 17:00 عصر
در صورتی که تکراری باشه بصورت طبعی خطا تولید میشه و شما باید خطا رو مدیریت کنید برای این کار هم میتونید از کلاس
Sqlexpection استفاده کنید به این صورت :

try
{
//Insert Code
}
catch(Sqlexpection ex)
{
if (ex.Number ==2627)
{
//MessageBox
}
}

morteza271
دوشنبه 10 بهمن 1390, 17:04 عصر
یه روش دیگه هم اینه که میتونید انجام بدین.
البته شبیه روش دستمون هست ولی به نظرم بهتره :
توی همون پروسیجری که insert می کنید اولش چک کنید اگه شماره داشنجویی هست که مثلا -1 برگردونه و اگه وجود نداره عمل درج رو انجام بده و یه عدد دیگه برگردونه.
بعد از اجرای پروسیجر چک می کنید که اگر عدد برگردانده شده -1 بود خطای مناسب رو نمایش می دین.

کدی که عمل چک کردن رو انجام میده رو میتونید به صورت زیر بنویسید:

if exists (select ID From TableName Where ID=@ID)
return -1;
else
// insert
return 1;
که @ID هم یک پارامتر هست (در مثال شما شماره دانشجویی مورد نظر)
موفق باشید

emi.cheshmak
سه شنبه 11 بهمن 1390, 10:11 صبح
بسیار ممنووونم.
یه چیزی بگم؟من به procedureای که قبلا نوشته بودم دست نزدم اصلا شرط نذاشتم اونجا.اومدم تو برنامهtry/catch نوشتم جواب داد:تشویق:

returnx
سه شنبه 11 بهمن 1390, 10:27 صبح
بسیار ممنووونم.
یه چیزی بگم؟من به procedureای که قبلا نوشته بودم دست نزدم اصلا شرط نذاشتم اونجا.اومدم تو برنامهtry/catch نوشتم جواب داد:تشویق:
درستش همینه ، اگه قرار باشه شما کل رکورد ها رو پیمایش کنید تا ببینید که رکوردی ثبت شده یا نه ، پس SQLServer اینجا چی کار قرار انجام بده!؟
این وظایف به عهده ی بانک اطلاعاتی است نه برنامه نویس...