PDA

View Full Version : سوال: جلوگیری از ورود داده های تکراری در بانک اطلاعاتی



hesam67_b
دوشنبه 18 مرداد 1389, 18:45 عصر
با سلام به دوستان عزیز.

من میخوام وقتی کاربر یک (اسمش رو میزارم گروه)، گروه جدید اضافه میکنه اول چک کنیم تا ببینیم تکراری نباشه.
میخوام اگر تکراری بود یک پیغام با متن تکراری بودن نمایش داده بشه.

من کد زیر رو نوشتم. کد کار میکنه و وقتی داده تکراری باشه گروه ثبت نمیشه. اما پیغام نمایش داده نمیشه :ناراحت:

از try...catch استفاده کردم ولی جواب نمیده.

ممنون میشم دوستان راهنمایی کنن که اشکال این کد کجاست؟؟


try
{
SqlConnection objconnection = new SqlConnection(add_conn);
SqlCommand objCommand = new SqlCommand("IF NOT EXISTS(Select * From Groups Where Groups = @Group) BEGIN Insert into Groups (Groups) Values (@Group) END", objconnection);
objCommand.Parameters.AddWithValue("@Group", txtGroupName.Text);
objconnection.Open();
objCommand.ExecuteNonQuery();
objconnection.Close();
txtGroupName.Clear();
}
catch
{
MessageBox.Show("این گروه قبلا ثبت شده است", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtGroupName.Clear();
}

mmd2009
دوشنبه 18 مرداد 1389, 19:02 عصر
با سلام

بانک شما کلید اصلی داره؟؟؟

try-catch رو روی اون تنظیم کن

مهدی فرزاد
دوشنبه 18 مرداد 1389, 19:04 عصر
شما میتونید از If استفاده کنید و چک کنید اگه نام قبل ثبت شده بود و در بانک موجود بود یعنی رکوردی با این مشخصات داشت پیغام بده و اگه نه ثبتش کنه

hesam67_b
دوشنبه 18 مرداد 1389, 19:16 عصر
با سلام

بانک شما کلید اصلی داره؟؟؟

try-catch رو روی اون تنظیم کن


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

میشه بیشتر راهنمایی کنی

mmd2009
دوشنبه 18 مرداد 1389, 19:21 عصر
ببین دوست عزیز منظور من این بود مثلا من میخوام یک رکورد رو درج کنم و کلید اصلی همونطور که میدونی یکتاست پس اگر بخوام دو فیلد هم نام بسازم باید Error بده

خب در این حالت شما باید بیایی این کارو بکنی



try
{

//عملیات درج در صورتی که فیلد تکراری نباشد

}

catch ()

{
messagebox.show("این فیلد قبلا ثبت شد")

}

finaly

{

// بستن دیتابیس

}

hesam67_b
دوشنبه 18 مرداد 1389, 19:32 عصر
ممنون دوست عزیز.
مشکلم حل شد.

یه سوال دارم

مگه خطای مربوط به تکرار کلید اصلی در بانک اطلاعاتی MissingPrimaryKeyException نیست؟

چون من وقتی به صورت

catch(MissingPrimaryKeyException)
که وارد کردم پیغام خطا نمایش داده نشد و خطای زمان اجرا داشت

ولی وقتی به صورت catch که قرار دادم به درستی کار کرد.:متفکر::متفکر:

مهدی فرزاد
دوشنبه 18 مرداد 1389, 19:42 عصر
اینم نگاه کن ممکنه بعضی وقتها فیلد کلیدی رو نخوای چک کنی
این اصولی تره


SqlDataAdapter sqlDa = new SqlDataAdapter("SELECT * FROM UserTable", استرینگ کانکشن);
sqlDa.Fill(dataset1, "UserTable");
DataSet dataset1 = new DataSet();
DataView dataViw1 = new DataView(dataset1.Tables["UserTable"]);
dataViw1.RowFilter = "User_Name = '" + strUserName + "'";

if (dataViw1.Count == 0)
{
SqlCommand objCom = new SqlCommand();
objCom.Connection = استرینگ کانکشن;
objCom.CommandText = "INSERT INTO UserTable " +
"(F_Name, L_Name, User_Name) " +
"VALUES(@F_Name, @L_Name, @User_Name)";
objCom.Parameters.AddWithValue("@F_Name", strFName);
objCom.Parameters.AddWithValue("@L_Name", strLName);
objCom.Parameters.AddWithValue("@User_Name", strUserName);
objCom.Connection.Open();
objCom.ExecuteNonQuery();
objCom.Connection.Close();

}
else
پیغام مناسب

mmd2009
دوشنبه 18 مرداد 1389, 19:47 عصر
میشه بپرسم کجای این اصولی تره ؟

مهدی فرزاد
دوشنبه 18 مرداد 1389, 19:53 عصر
میشه بپرسم کجای این اصولی تره ؟

یه برنامه نویس باید همیشه سعی کنه خطا ها رو به حداقل برسونه نه اینکه با Try و catch از اونا فرار کنه
درضمن اگه شما فیلدی رو که میخواید چک کنید کلیدی نباشه چی؟؟؟
من قصد جسارت به شما رو نداشتم فقط راه حل دیگه ای رو گفتم. به هر حال شما یک روش دارید و دیگران هم روش دیگه
البته شاید نباید میگفتم اصولی تر بهتر بود میگفتم بهتره (البته از نظر من )
:لبخندساده::لبخندساده::قلب:

mmd2009
دوشنبه 18 مرداد 1389, 20:35 عصر
دوست عزیز من گفتم دلیلتون رو بگید و الا اصلا قصد این رو نداشتم بگم راه شما اصولی نیست

اتفاقا راه شما هم خیلی خوبه

و البته من با Try و catch قصد فرار رو نداشتم در اونجا

فقط راهی بود برای اینکه داده ی تکراری وارد بانک نشه

ولی راه شما هم خیلی خوبه

ممنونم از شما

hesam67_b
دوشنبه 18 مرداد 1389, 21:09 عصر
دوستان یه منبع سراغ ندارین ما معنی خطاهای مربوط به catch رو بفهمیم؟ :ناراحت:

من توی جدول تیک allow null مربوط به 2 تا فیلد رو برداشتم ولی حالا وقتی از catch(NoNullAllowedException) استفاده میکنم جواب نمیده.

در حالت کلی خیلی سوال توی ذهن دارم در مورد این catch

جالب اینجاست که هیچ کدوم از خطاها کار نمیکنه. FormatException رو هم امتحان کردم ولی جواب نمیده.

به نظر شما مشکل کجاست:عصبانی++:

hossein_sh2008
یک شنبه 27 آذر 1390, 08:33 صبح
با سلام
بهترين روش اينه كه از روي خطا و نوع اون عملي رو انجام بديد مثلا كد زير را در catch بنويسيد


catch (Exception pp)
{
if (pp.Message.Contains("Cannot insert duplicate key in object") )
{
MessageBox.Show("اين فاكتور قبلا ثبت شده");


}

sg.programmer
یک شنبه 27 آذر 1390, 08:55 صبح
چرا خطا ایجاد شه بعد ببینی که تکراری بوده

ابتدا یک کوئری بگیر اگه وجود نداشت ثبت کن



select Count (Group) from table where Group='value'


اگر مساوی با صفر بود یعنی وجود ندارد بعد insert کن

اگه کد کاملشو میخوای بگو تا قرار بدم

az.heidarzadeh
یک شنبه 27 آذر 1390, 09:48 صبح
این کار رو هم میتونی انجام بدی، سمت Sql فیلد جدولت رو Unique Key قرار بدی اونوقت دیگه خود Sql نمیزاره شما داده تکراری وارد کنی فقط تنها کاری که باید انجام بدی اینه که توی SP اضافه کردنت یه RAISERROR بنویسی و اینطرف Exeption رو مدیریت کنی...
اینم باز اصولی تره :چشمک:

elahejafari
یک شنبه 27 آذر 1390, 10:41 صبح
کد زیر جواب میده
SqlConnection objConnection = new SqlConnection("Data Source=.;Initial Catalog=Gp;Integrated Security=True");
SqlCommand objCommand = new SqlCommand();
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
query_string = "IF NOT EXISTS (Select * From A_Table Where nameA = @dGroup) " +
"BEGIN " +
"Insert into A_Table (nameA) Values (@dGroup) " +
"End ";
objCommand.Parameters.AddWithValue("dGroup", textBox1.Text);
objCommand.Connection = objConnection;
objCommand.CommandText = query_string;
objConnection.Open();
int dr = objCommand.ExecuteNonQuery();
objConnection.Close();
if (dr == -1)
textBox2.Text = "تکراری";
else
textBox2.Text = "ok";

h-rafiee
یک شنبه 27 آذر 1390, 12:08 عصر
از دستورات try catch استفاده کنی بهتره
کاری هم نداره انواع اقسام حالاتی که یک کاربر می تونه انجام بده رو تست کن حتما ارروری میده همون عنوان اررور رو برای Catch بنویس.

try
{
دستورات درج اطلاعات
}
catch (FormatException)
{
MessageBox.Show("مقادیر وارد شده صحیح نمی باشد کد باید به صورت عدد وارد گردد", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
}
catch (SqlException)
{
MessageBox.Show("کد وارد شده در بانک موجود است", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
}


این نومنه دستوریه که خودم استفاده می کنم. اررورهای که نشون میده هم گویای کد دستور Catch هستش.البته روی دستور catch دوم روی کلید حساس هستش:)

h-rafiee
یک شنبه 27 آذر 1390, 12:25 عصر
خیلی جالبه دوستانی با ساختن دستور Catch اون رو اصولی تر تعریف کردن درحالی که دنیای برنامه نویسی به سرعت اجرای برنامه و بهینه بودن برنامه و خوانایی کد نویسی اون و نگهداری آسونتر و عیب یابی سریعتر می باشد.
مثل این می مونه که ما با اینکه کلاسی برای اتصال به بانک ساخته ایم بیاییم در هر قسمت یک ارتباط بسازیم که چندان معقولانه به نظر نمی رسه یا اینکه بیایم بجای استفاده از سربرگها بیایم کل سربرگها رو بنویسم.
دلیلی در استفاده از دستورات if در چنین مواردی وجود نداره
من قست جسارت نداشتم فقط چند نکته در علم مهندسی نرم افزار رو بیان کردم

ma.rad
یک شنبه 27 آذر 1390, 13:49 عصر
شما می تونید از sql exception برای جلو گیری از ورود داده تکراری استفاده کنی

az.heidarzadeh
پنج شنبه 01 دی 1390, 12:46 عصر
خیلی جالبه دوستانی با ساختن دستور Catch اون رو اصولی تر تعریف کردن درحالی که دنیای برنامه نویسی به سرعت اجرای برنامه و بهینه بودن برنامه و خوانایی کد نویسی اون و نگهداری آسونتر و عیب یابی سریعتر می باشد.
مثل این می مونه که ما با اینکه کلاسی برای اتصال به بانک ساخته ایم بیاییم در هر قسمت یک ارتباط بسازیم که چندان معقولانه به نظر نمی رسه یا اینکه بیایم بجای استفاده از سربرگها بیایم کل سربرگها رو بنویسم.
دلیلی در استفاده از دستورات if در چنین مواردی وجود نداره
من قست جسارت نداشتم فقط چند نکته در علم مهندسی نرم افزار رو بیان کردم
شاید من درست متوجه عرایض شما نشدم، تا اونجایی که علم مهندسی نرم افزار میگه یکی از اصولی ترین کارهایی که باید توی کدنویسی انجام بشه استفاده از try catch و مدیریت exeption هاست حالا میشه بیشتر توضیح بدید منظورتون چیه؟...

javady_joon
جمعه 28 شهریور 1393, 12:37 عصر
میشه یه جوری حرف بزنید ماهم بفهمیم؟
الان چطور شد؟ چطور میشه جلوگیری کرد؟