PDA

View Full Version : بهترین حالت برای نمایش خطای تکراری بودن رکورد ثبتی



samiasoft
شنبه 14 مرداد 1396, 14:35 عصر
سلام دوستان

شاید بگید این مساله تکراری هست اما من میخوام ببینم چه روشی برای این کار بهترین حالت هستش؟

یعنی فرض کنید ما میخواهیم به کاربر نمایش بدیم که رکوردی که داخل دیتابیس ثبت میکنه تکراریه.

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


try {
connect.Close();
connect.Open();
SqlCommand CMD = new SqlCommand("insert into login1 Values(@username,@pass)", connect);


CMD.Parameters.AddWithValue("@username", textBox6.Text);
CMD.Parameters.AddWithValue("@pass", textBox4.Text);


CMD.ExecuteNonQuery();
connect.Close();




MessageBox.Show("باموفقیت ذخیره شد");




}catch
{




MessageBox.Show("نام کاربری وارد شده تکراری می باشد");
}

حال در قسمت catch اومدم پیغامی نوشتم که اگر خطا داد احتمال زیاد بخاطر اینه که نام کاربری تکراری وارد شده...ولی شاید در این حالت مثلا خطا به دلیل چیزهای دیگر باشه...چطوری در این جا واقعا مطمئن بشم که خطا به خاطر تکراری بودن هستش؟ چون این حالتی که نوشتم برای تمامی خطا ها پیام تکراری بودن میاد.

محمد آشتیانی
شنبه 14 مرداد 1396, 16:37 عصر
سلام


try
{
//کدهای درج اطلاعات
}
catch (SqlException sqlException)
{
//میتونید استثناهای اسکیوال رو با کدشون هندل کنید
if (sqlException.Number == 2601)
MessageBox.Show(sqlException.Message);
}
catch (Exception exception)
{
//بقیه استثناها
MessageBox.Show(exception.Message);
}



کد 2601 مربوط به درج رکورد تکراری هست
کل کدهای استثنای SqlServer رو میتونید با این کوئری داخل SSMS ببینید


SELECT * FROM sys.messages
WHERE language_id = 1033

RIG000
شنبه 14 مرداد 1396, 16:48 عصر
جواب در پست قبلی توسط دوست ما داده شد.
اما در مرود اینکه در موارد دیگه به مشکل نخوری و بحث Exception Handling رو پیاده سازی کنی بهتر هست از پایه اینمقابه رو بخونی و در مورد یک try و چندین catch‌بدونی.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch

samiasoft
شنبه 14 مرداد 1396, 17:27 عصر
سلام

کد 2601 مربوط به درج رکورد تکراری هست
کل کدهای استثنای SqlServer رو میتونید با این کوئری داخل SSMS ببینید



ولی برای من کد درج رکورد تکراری 2627 اومد اونطور که بررسی کردم...چرا برای شما کد 2601 هست؟!!

RIG000
شنبه 14 مرداد 1396, 18:00 عصر
چون برای شما (2627)هندل کردنunique constraint هست که شامل unique Index میشه ولی برای ایشون هندل کردن unique Index هست.

این کد رو اجرا کن میبینی که هر دو کد مورد نظر که دنبال تفاوتشون هستی رو توضیح داده و در کنار اون چند تا سطر دیگه با کد های مختلف برای duplicate key درنظر گرفته شده.
SELECT* FROM sys.messages
WHERE text like '%duplicate%' and text like '%key%' and language_id = 1033

samiasoft
شنبه 14 مرداد 1396, 19:40 عصر
متشکرم از شما دوستان عزیز

فقط در مورد دیتابیس اکسس چطوری میتونم این استثناها رو ببینم؟ کوئری اون به چه نحوی هستش؟

mr.sirwan
دوشنبه 16 مرداد 1396, 15:34 عصر
با سلام، خب دوست عزیز این چه روشیه که شما پیش گرفتی؟ چرا قبل از دستور insert نمیای یه سلکت بزنی ببینی یوزرنیم وارد شده تکراری هست یا نه، اگه تکراری بود پیام بده و گرنه عمل درج رو انجام بده، این همه دردسر هم نداره. مشکل شما با این روش چیه که رفتی سراغ catch های متعدد؟

محمد آشتیانی
دوشنبه 16 مرداد 1396, 15:51 عصر
با سلام، خب دوست عزیز این چه روشیه که شما پیش گرفتی؟ چرا قبل از دستور insert نمیای یه سلکت بزنی ببینی یوزرنیم وارد شده تکراری هست یا نه، اگه تکراری بود پیام بده و گرنه عمل درج رو انجام بده، این همه دردسر هم نداره. مشکل شما با این روش چیه که رفتی سراغ catch های متعدد؟

سلام
یعنی به نظر شما ، این روشی که گفته شد بهتره یا اینکه کوئری بزنید و نتیجه کوئری رو بگیرید و مقایسه کنید و اگر تکراری بود ، خطا نشون بدید؟!

mr.sirwan
دوشنبه 16 مرداد 1396, 16:16 عصر
درود جناب اشتیانی عزیز، قبول دارم که با روشی که بنده عرض کردم، در حالتی که یوزرنیم دردسترس باشه دوتا کوئری اجرا میشه ولی تو یکی از مراجع انگلیسی خوندم که نوشته بود "واسه شرایطی که بصورت معمول رخ میدن، بهتر هست طوری اونهارو هندل کنین که از رخداد exception اجتناب بشه" در این مورد هم یوزرنیم چیزیه که اکثر افراد با ازمون و خطا یه یوزرنیم رو انتخاب مبکنن، یعنی اول کلمه ای رو انتخاب میکنن اگه قبلا ثبت شده بود دوباره یه کلمه دیگه و ....

samiasoft
دوشنبه 16 مرداد 1396, 16:20 عصر
با سلام، خب دوست عزیز این چه روشیه که شما پیش گرفتی؟ چرا قبل از دستور insert نمیای یه سلکت بزنی ببینی یوزرنیم وارد شده تکراری هست یا نه، اگه تکراری بود پیام بده و گرنه عمل درج رو انجام بده، این همه دردسر هم نداره. مشکل شما با این روش چیه که رفتی سراغ catch های متعدد؟

فرض کن ما یه میلیون رکورد یا بیشتر داریم...به نظرت با این سلکت بیاد ببینه یوزرنیم تکراریه یا نه راه ایده الیه؟ یا با یه try catch...من فکر میکنم در سلکت تا بیاد کل رکورد رو بگرده سرعت پایین هستش و کاربر باید کمی منتظرباشه...ولی در try catch سرعت عملش بیشتره اینطور نیست؟

mr.sirwan
دوشنبه 16 مرداد 1396, 16:28 عصر
مطمئن باش در این مورد، کوئری سلکت با میلیون رکورد و میلیارد رکورد از لحاظ سرعت اجرا مشکلی نخواهند داشت

RIG000
دوشنبه 16 مرداد 1396, 16:51 عصر
مطمئن باش در این مورد، کوئری سلکت با میلیون رکورد و میلیارد رکورد از لحاظ سرعت اجرا مشکلی نخواهند داشت
من دیگه حرفی ندارم.

samiasoft
دوشنبه 16 مرداد 1396, 17:14 عصر
من دیگه حرفی ندارم.

واضحتر بیان میکنید نظرتونو؟

RIG000
دوشنبه 16 مرداد 1396, 19:20 عصر
سلام
یعنی به نظر شما ، این روشی که گفته شد بهتره یا اینکه کوئری بزنید و نتیجه کوئری رو بگیرید و مقایسه کنید و اگر تکراری بود ، خطا نشون بدید؟!
samiasoft (http://barnamenevis.org/member.php?267633-samiasoft)

یعنی اینکه این موردی که بالا اشاره کرد دستمون یعنی اینکه وقتی ما میتونیم با یک کار اصولی خطا رو هندل کنیم بریم یک کویری اضافه بزنیم پرا دیگه بریم یه کویری بزنیم تا بخایم مدیریت خطا کنیم؟!!!!!!!!!!
علامت تعجب یعنی همین موضوع که دستمون اشاره کردن. شما با هندل کردن اکسپشن میتونید هم برنامه رو از روی اصول پیش ببرید و هم به پرفورمنس دیتابیس هم اهمیت بدید .
پس یک اینکار برای این مورد در اینجا یک کار اشتباست
و دو اینکه در پروژه های بزرگ هر برنامه نویس واسه هر زیرستیم از این حرکت ها بزنه پس پروژه در حال ترکیدن هست.
درنهایت برای این مورد در اینجا یک کویری زدن و چک کردن در این حالت راهی هست که جواب میده اما کاملا نادرست.

mr.sirwan
دوشنبه 16 مرداد 1396, 23:51 عصر
samiasoft (http://barnamenevis.org/member.php?267633-samiasoft)یعنی اینکه این موردی که بالا اشاره کرد دستمون یعنی اینکه وقتی ما میتونیم با یک کار اصولی خطا رو هندل کنیم بریم یک کویری اضافه بزنیم پرا دیگه بریم یه کویری بزنیم تا بخایم مدیریت خطا کنیم؟!!!!!!!!!!
علامت تعجب یعنی همین موضوع که دستمون اشاره کردن. شما با هندل کردن اکسپشن میتونید هم برنامه رو از روی اصول پیش ببرید و هم به پرفورمنس دیتابیس هم اهمیت بدید .
پس یک اینکار برای این مورد در اینجا یک کار اشتباست
و دو اینکه در پروژه های بزرگ هر برنامه نویس واسه هر زیرستیم از این حرکت ها بزنه پس پروژه در حال ترکیدن هست.
درنهایت برای این مورد در اینجا یک کویری زدن و چک کردن در این حالت راهی هست که جواب میده اما کاملا نادرست.

درسته حق با شماس، من تو جواب دهی عجله کردم و قبل از اینکه صد درصد مطمئن بشم اینجا جواب دادم، بعدش رفتم یه دیتابیس خیلی ساده با یه جدول و دوتا فیلد درست کردم و توش 12 میلیون و خورده ای داده ریختم، نتیجه جالب بود: واسه سلکت هایی که داده داخل جدول موجود بود، زمان اجرای کوئری به ثانیه نمیکشید و فقط در عرض میلی ثانیه اجرا میشد. اما واسه سلکتی که داده مورد نظرم داخل جول موجود نبود، زمان اجرا تا 3 و 4 ثانیه هم میرسید.

sldvhlds
دوشنبه 23 مرداد 1396, 20:37 عصر
سلام


try
{
//کدهای درج اطلاعات
}
catch (SqlException sqlException)
{
//میتونید استثناهای اسکیوال رو با کدشون هندل کنید
if (sqlException.Number == 2601)
MessageBox.Show(sqlException.Message);
}
catch (Exception exception)
{
//بقیه استثناها
MessageBox.Show(exception.Message);
}



کد 2601 مربوط به درج رکورد تکراری هست
کل کدهای استثنای SqlServer رو میتونید با این کوئری داخل SSMS ببینید


SELECT * FROM sys.messages
WHERE language_id = 1033

با سلام جناب آشتیانی اگه توی جدول بخواهیم با یک شرط داده تکراری وارد نشود چکار کنیم مثلا اگر مقدار فیلد 1جدول برابر x بودو مقدار فیلد 3 برابر با z بود در فیلد 2 داده تکراری بپذیر وگرنه نپذیر با استفاده از دستورات شما البته ممنون