PDA

View Full Version : مشکل ثبت کردن دوباره اطلاعات در sql sarver



mahdi_7610
چهارشنبه 09 اردیبهشت 1388, 12:44 عصر
سلام

من توی پروژه ام از پایگاه داده sql sarver استفاده کردم .

دانشجو قراره اطلاعاتش را وارد کنه و من شماره دانشجویی را primary key تعریف کردم
حالا وقتی یکی از دانشجوها مشخصاتش را وارد میکنه و اطلاعاتش ثبت میشه اگه دوباره دکمه insert را که همون مشخصات با همون شماره دانشجویی هست را بزنه برنامه پیغامی مبنی بر این شماره دانشجویی primary هست میده .

من میخوام این پیغام به صورت فارسی داده بشه . چی کار باید بکنم . یعنی پیغام به این صورت باشه که این شماره دانشجویی قبلا ثبت شده

دوم اینکه وقتی دانشجو اطلاعاتش ثبت می شه و دوباره همون اطلاعات را وارد میکنه پیغامی که داده می شه به دلیل primary key بودن شماره دانشجویی اما مشکل اینجاست که وقتی اطلاعات را پاک میکنه و دوباره اطلاعات دیگه ای را وارد میکنه دیگه هیچ اطلاعی ثبت نمی شه و کاربر مجبوره یکبار برنامه را ببنده و دوباره باز کنه .

چه طور می تونم این دوتا مشکل را حل کنم .

مرسی

a.maleki
چهارشنبه 09 اردیبهشت 1388, 15:35 عصر
دوست عزیز لطفا کدی که نوشتید بگذارید تا بهتر بشه کمک کرد
جهت رفع مشکل دوم کافی از دستور try استفاده کنید و نوع Catch و exseption رو از نوع sql و فقط کافی است که یک شرظ بگذارید که اگر فرض کد خطا مثلا 100 بود فالن پیغام رو بده

khaste_007
چهارشنبه 09 اردیبهشت 1388, 15:54 عصر
با سلام
در مورد مشکل اول باید بگم کارهای زیادی میتونی انجام بدی من به دو مورد اشاره می کنم.
1. قبل از ثبت با یک کوئری primary key دانشجوی جدید رو سرچ کنی و اگر موجود بود ثبت نکنی و پیغام را نشان دهی.
2 . استفاده از Try...Catch ؛ که شما رویه ثبت رو در بلوک try و رویه نمایش پیغام خطا رو در قست catch قرار می دهی و بر حسب اینکه چه خطایی رخ داده پیغام مناسب رو نشان می دی که این راه حل بر راه اول اولویت دارد
برای مطالعه بیشتر در این رابطه می توانی در مورد Try...Catch...Finally در همین سایت سرچ کنی یا اطلاعات کامل رو از سایت مایکروسافت در آدرس زیر مطالعه کنی
http://msdn.microsoft.com/en-us/library/0yd65esw(VS.80).aspx (http://msdn.microsoft.com/en-us/library/0yd65esw%28VS.80%29.aspx)

و اما مشکل دوم به احتمال زیاد شما در پیاده سازی کدتون اشتباه کردید که ما تا کد شما رو نداشته باشیم نمی تونیم نظر قطعی بدیم ولی اینگونه اشتباهات معمولا بر اثر کپی پیست به وجود میاد یعنی شما کدی رو چند جا کپی کردید یکجا تغییر و اصلاح کرده اید ولی جاهای دیگر را فراموش کردید به هر حال باید برای اینکار برنامه را تریس کنید و در نقاط حساس مثل زمان حذف و زمان ثبت مجدد و بستن برنامه و ... بانک اطلاعات و منابع سیستم رو چک کنید . حتی ممکن هست که برای بار دوم که ثبت می کنید ثبت شده باشد ولی مثلا DataGridView رو refresh نکرده باشید.
موفق باشید.

mahdi_7610
چهارشنبه 09 اردیبهشت 1388, 19:25 عصر
با سلام
در مورد مشکل اول باید بگم کارهای زیادی میتونی انجام بدی من به دو مورد اشاره می کنم.
1. قبل از ثبت با یک کوئری primary key دانشجوی جدید رو سرچ کنی و اگر موجود بود ثبت نکنی و پیغام را نشان دهی.
2 . استفاده از Try...Catch ؛ که شما رویه ثبت رو در بلوک try و رویه نمایش پیغام خطا رو در قست catch قرار می دهی و بر حسب اینکه چه خطایی رخ داده پیغام مناسب رو نشان می دی که این راه حل بر راه اول اولویت دارد
برای مطالعه بیشتر در این رابطه می توانی در مورد Try...Catch...Finally در همین سایت سرچ کنی یا اطلاعات کامل رو از سایت مایکروسافت در آدرس زیر مطالعه کنی
http://msdn.microsoft.com/en-us/library/0yd65esw(VS.80).aspx (http://msdn.microsoft.com/en-us/library/0yd65esw%28VS.80%29.aspx)

و اما مشکل دوم به احتمال زیاد شما در پیاده سازی کدتون اشتباه کردید که ما تا کد شما رو نداشته باشیم نمی تونیم نظر قطعی بدیم ولی اینگونه اشتباهات معمولا بر اثر کپی پیست به وجود میاد یعنی شما کدی رو چند جا کپی کردید یکجا تغییر و اصلاح کرده اید ولی جاهای دیگر را فراموش کردید به هر حال باید برای اینکار برنامه را تریس کنید و در نقاط حساس مثل زمان حذف و زمان ثبت مجدد و بستن برنامه و ... بانک اطلاعات و منابع سیستم رو چک کنید . حتی ممکن هست که برای بار دوم که ثبت می کنید ثبت شده باشد ولی مثلا DataGridView رو refresh نکرده باشید.
موفق باشید.

سلام دوست عزیز

مشکل اول حل شد . من از try و catch استفاده کرده بودم . اما یادم رفته بود به جای massage پیغامی که دوست دارم را بزارم .

اما مشکل دوم را نمیدونم چه طور حل کنم . یعنی وقتی پیغام داده می شه که چنین شماره ای قبلا ثبت شده . وقتی کاربر ID را ویرایش میکنه دوباره همون پیغام را میده که چنین شماره ای قبلا ثبت شده و اصلا اطلاعات جدید ثبت نمی شه .

این هم کی که برای دکمه insert نوشتم .


private void btnInsert_Click(object sender, EventArgs e)
{
try
{
string str1;
str1 = "INSERT INTO TBook(Name, ID, Number) VALUES(@Name, @ID, @Number)";
con.Open();
cmd = new SqlCommand(str1, con);
cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = txtName.Text;
cmd.Parameters.Add("@ID", SqlDbType.NVarChar, 50).Value = txtID.Text;
cmd.Parameters.Add("@Number", SqlDbType.NVarChar, 50).Value = txtNumber.Text;
cmd.ExecuteNonQuery();
ds.Clear();
da.Fill(ds, "TBook");
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت شد");
}
catch (System.Exception)
{
MessageBox.Show("این شماره دانشجویی قبلا ثبت شده است");
}
}

khaste_007
چهارشنبه 09 اردیبهشت 1388, 19:44 عصر
شما برای هر خطایی که درون try اتفاق می افتد یک پیغام نشان می دهید و معلوم نیست خطا کجا رخ داده برنامه را تریس کنید و بگویید دقیقا خطا در چه خطی از برنامه رخ می دهد.

mahdi_7610
چهارشنبه 09 اردیبهشت 1388, 20:18 عصر
شما برای هر خطایی که درون try اتفاق می افتد یک پیغام نشان می دهید و معلوم نیست خطا کجا رخ داده برنامه را تریس کنید و بگویید دقیقا خطا در چه خطی از برنامه رخ می دهد.
سلام

خطا توی خطی که توی پست 4 ابی کردم داده می شه .

متن خطا هم اینه


{"Violation of PRIMARY KEY constraint 'PK_Table_1'. Cannot insert duplicate key in object 'dbo.TBook'.\r\nThe statement has been terminated."}

مرسی

araelectronic@ymail.com
چهارشنبه 09 اردیبهشت 1388, 23:01 عصر
با سلام
دوست عزیز در قسمت catch و قبل از نمایش پیغام کانکشن خود را ببندید . con.close خطا به دلیل باز کردن مجدد کانکشن باز اتفاق می افتد.
موفق باشید

khaste_007
پنج شنبه 10 اردیبهشت 1388, 08:52 صبح
با سلام
دوست عزیز در قسمت catch و قبل از نمایش پیغام کانکشن خود را ببندید . con.close خطا به دلیل باز کردن مجدد کانکشن باز اتفاق می افتد.
موفق باشید
با سلام و عرض پوزش
در قسمت catch نباید کانکشن رو بست بلکه استاندارد آن در قسمت Finally می باشد.
همچنین متن خطا دلالت بر تلاش برای ثبت اطلاعات primary key تکراری هست و ربطی به کانکشن ندارد.


خطا توی خطی که توی پست 4 ابی کردم داده می شه .همونطور که دیده میشه اطلاعات با این primary key قبلا ثبت شده، وقتی این خطا رو میده یعنی حتما ثبت شده و نمی دونم شما چطور می گید ثبت نشده احتمالا جای دیگه ای غیر از دیتا بیس اصلی رو چک می کنید به هر صورت باید بیشتر دقت کنید همچنین روال حذف رو هم چک کنید.
موفق باشید.

mahdi_7610
پنج شنبه 10 اردیبهشت 1388, 11:57 صبح
سلام
دست هر دوی شما دوستان درد نکنه

مشکل حل شد . درسته من کانکشن را نبسته بودم . در حالت Finally کانکشن را بستم و مشکل حل شد .

مرسی

araelectronic@ymail.com
پنج شنبه 10 اردیبهشت 1388, 16:35 عصر
با سلام و عرض پوزش
در قسمت catch نباید کانکشن رو بست بلکه استاندارد آن در قسمت Finally می باشد.
همچنین متن خطا دلالت بر تلاش برای ثبت اطلاعات primary key تکراری هست و ربطی به کانکشن ندارد.



با سلام
ممنون از راهناییتون ولی دوست عزیز بستن کانکشن جای خاصی نداره جایی باید بست که مورد نیاز است.

khaste_007
پنج شنبه 10 اردیبهشت 1388, 17:12 عصر
با سلام
ممنون از راهناییتون ولی دوست عزیز بستن کانکشن جای خاصی نداره جایی باید بست که مورد نیاز است.
با سلام
برای روشن شدن مطلب بیشتر توضیح می دهم
بله هر جایی می توانید ببندید من هم که گفتم استاندارد مثلا وقتی شما کانکشن را در catch ببندید فقط وقتی یک خطا رخ می دهد کانکشن بسته خواهد شد که برای رفع آن هم باید در catch و هم try کانکشن رو ببندید که این استاندارد کد نویسی نیست که دو بار این کار را بکنید و اصلا فلسفه وجود داشتن Finally همین هست که هر کاری که چه خطا رخ بدهد و چه ندهد باید انجام شود در این قسمت نوشته می شود.
من قصدم تذکر روش درست کد نویسی بود و اگر نه که کد رو هزار جور میشه نوشت.:چشمک:

araelectronic@ymail.com
پنج شنبه 10 اردیبهشت 1388, 22:07 عصر
با سلام و عرض پوزش
همچنین متن خطا دلالت بر تلاش برای ثبت اطلاعات primary key تکراری هست و ربطی به کانکشن ندارد.

همونطور که دیده میشه اطلاعات با این primary key قبلا ثبت شده، وقتی این خطا رو میده یعنی حتما ثبت شده و نمی دونم شما چطور می گید ثبت نشده احتمالا جای دیگه ای غیر از دیتا بیس اصلی رو چک می کنید به هر صورت باید بیشتر دقت کنید همچنین روال حذف رو هم چک کنید.
موفق باشید.


با سلام
دوست عزیز ممنون از تلاش شما . ولی سعی کنید اول برنامه نویسی را یاد بگیرید و error را تشخیص بدید . بعدا در مورد نحوه برنامه نوشتن آموزش بدید در آنصورت حرف و تذکرتون تاثیر بیشتری خواهد داشت و مبتدی هایی مثل من هم استقبال میکنند.
موفق باشید