PDA

View Full Version : عدم ورود داده تکراری بعد از آپدیت



jafarpalideh
دوشنبه 03 اردیبهشت 1397, 15:06 عصر
با سلام به همه
فرض کنید که من یه جدول اشخاص دارم شامل PsersonID که کلید اصلیه و اتومات زیاد میشه
3 تا فیلد دیگه هم به نام کد ملی و نام و نام خانوادگی
موقع Insert میتونم داده تکراری رو تشخیص بدم . ولی موقع آپدیت یک رکورد نمیدونم چطور داده تکراری اگه وارد شده رو تشخیص بدم .
یعنی کاربر بیاد و یه کد ملی رو دقیقا مثل کد ملی که قبلا وارد شده ویرایش کنه .

Mahmoud.Afrad
دوشنبه 03 اردیبهشت 1397, 21:03 عصر
میتونید ستون کدملی را یونیک کنید تا در صورت تکراری بودن استثناء رخ بده
https://www.w3schools.com/sql/sql_unique.asp

jafarpalideh
سه شنبه 04 اردیبهشت 1397, 08:44 صبح
میتونید ستون کدملی را یونیک کنید تا در صورت تکراری بودن استثناء رخ بده
https://www.w3schools.com/sql/sql_unique.asp


از استثنا نمیخوام استفاده کنم . داده رو هم نمیخوام یونیک کنم . تویه برنامه چطور میتونم چک کنم ؟

Mahmoud.Afrad
سه شنبه 04 اردیبهشت 1397, 15:19 عصر
از استثنا نمیخوام استفاده کنم . داده رو هم نمیخوام یونیک کنم . تویه برنامه چطور میتونم چک کنم ؟

https://stackoverflow.com/a/6909482

jafarpalideh
چهارشنبه 05 اردیبهشت 1397, 10:53 صبح
https://stackoverflow.com/a/6909482


این کوئری رو چطور تغییر بدم که کد ملی تکراری نباشه ؟






string Pid = txtPersonID.Text;
string Update = "Update TblPerson set PersonCodeMelli = '{0}',PersonName = '{1}',PersonFamily = '{2}',PersonAddress = '{3}',PersonTell = '{4}',PersonFatherName = '{5}' where PersonID = '{6}'";
Update = string.Format(Update, txtPersonCodeMelli.Text.Trim(), txtPersonName.Text.Trim(), txtPersonFamily.Text.Trim(), txtPersonAddress.Text.Trim(), txtPersonTell.Text.Trim(), txtPersonFatherName.Text.Trim(), Pid);
Function.DoDml(Update);


MessageBox.Show("ویرایش شد");

Mahmoud.Afrad
چهارشنبه 05 اردیبهشت 1397, 22:45 عصر
از استثنا نمیخوام استفاده کنم . داده رو هم نمیخوام یونیک کنم . تویه برنامه چطور میتونم چک کنم ؟
چرا نمیتونید؟ این یکی از بهترین راه هاست.


این کوئری رو چطور تغییر بدم که کد ملی تکراری نباشه ؟



string Pid = txtPersonID.Text;
string Update = "Update TblPerson set PersonCodeMelli = '{0}',PersonName = '{1}',PersonFamily = '{2}',PersonAddress = '{3}',PersonTell = '{4}',PersonFatherName = '{5}' where PersonID = '{6}'";
Update = string.Format(Update, txtPersonCodeMelli.Text.Trim(), txtPersonName.Text.Trim(), txtPersonFamily.Text.Trim(), txtPersonAddress.Text.Trim(), txtPersonTell.Text.Trim(), txtPersonFatherName.Text.Trim(), Pid);
Function.DoDml(Update);


MessageBox.Show("ویرایش شد");

نمیدونم کلاسfunction و متد DoDml را به چه صورتی پیاده کردید ، اما اگر ستون را یونیک کنید ، سمت برنامه با یک try ... catch میتونید تکراری بودن رو متوجه بشید.

jafarpalideh
جمعه 07 اردیبهشت 1397, 09:53 صبح
چرا نمیتونید؟ این یکی از بهترین راه هاست.


نمیدونم کلاسfunction و متد DoDml را به چه صورتی پیاده کردید ، اما اگر ستون را یونیک کنید ، سمت برنامه با یک try ... catch میتونید تکراری بودن رو متوجه بشید.


به دلایلی نمیتونم از یونیک استفاده کنم .





public static void DoDml(string Query)
{
SqlConnection con = new SqlConnection();
con.ConnectionString =PM.Properties.Settings.Default.ConPM;
SqlCommand cmd = new SqlCommand(Query, con);
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd.ExecuteNonQuery();
con.Close();


}

Mahmoud.Afrad
جمعه 07 اردیبهشت 1397, 16:36 عصر
متدی که کوئری را اجرا میکند باید مقدار ExecuteNonQuery را برگشت دهد(تعداد سطر تحت تاثیر قرار گرفته
public int DoDml(string query)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = PM.Properties.Settings.Default.ConPM;
SqlCommand cmd = new SqlCommand(query, con);
if (con.State == ConnectionState.Closed)
{
con.Open();
}
int rowsAffected = cmd.ExecuteNonQuery();
con.Close();
return rowsAffected;
}

به صورت زیر عمل کنید(مثال)
string update =
@"
IF EXISTS(SELECT * FROM TblPerson WHERE PersonCodeMelli = '{0}' AND PersonID <> '{1}')
BEGIN
SELECT -1;
END
ELSE
BEGIN
Update TblPerson SET PersonCodeMelli = '{0}'
WHERE PersonID = '{1}'
END";
update = string.Format(update, txtPersonCodeMelli.Text.Trim(), Pid);
int result = DoDml(update);
if (result == -1)
{
MessageBox.Show(@"کد ملی تکراری");
}
else if (result > 0)
{
MessageBox.Show(@"ویرایش شد");
}