PDA

View Full Version : سوال: پيغام ركورد تكراري در sql و نشون دادن اون به كاربر در c#



javad.nic63
شنبه 30 خرداد 1388, 01:28 صبح
سلام. من يك فرم ايجاد كردم كه اطلاعات رو مي خونه و در پايگاه داده ميريزه. حالا ميخوام درصورتي كه ركورد تكراري در فيلد كليدم وارد كرد به كاربرم پيغام بده. كد زير رو هم با try-catchنوشتم كه نتيجه نگرفتم.


private void student_info()
{
SqlCommand com = new SqlCommand("insert into student (id,name,family,shenasnameh_id,melli_code,mahalle_ sodoor,father_name,birthday,live_ostan,live_city,l ive_address,posti_code,home_tell,mobile,e_mail,jen siat,sahmieh,noe,shaghel) values (@id,@name,@family,@shenasnameh,@melli,@sodoor,@fa ther,@birthday,@live_ostan,@live_city,@live_addres s,@posti_code,@home_tell,@mobile,@mail,@jensiat,@s ahmieh,@noe,@shaghel) ", conn);
if (conn.State == ConnectionState.Closed)
conn.Open();
com.Parameters.AddWithValue("@id", TextBox1.Text);
com.Parameters.AddWithValue("@name", TextBox2.Text);
com.Parameters.AddWithValue("@family", TextBox3.Text);
com.Parameters.AddWithValue("@shenasnameh", TextBox4.Text);
com.Parameters.AddWithValue("@melli", TextBox5.Text);
com.Parameters.AddWithValue("@father", TextBox6.Text);
com.Parameters.AddWithValue("@birthday", TextBox7.Text);
com.Parameters.AddWithValue("@sodoor", TextBox8.Text);
com.Parameters.AddWithValue("@live_ostan", TextBox9.Text);
com.Parameters.AddWithValue("@live_city", TextBox10.Text);
com.Parameters.AddWithValue("@live_address", TextBox11.Text);
com.Parameters.AddWithValue("@posti_code", TextBox12.Text);
com.Parameters.AddWithValue("@home_tell", TextBox13.Text);
com.Parameters.AddWithValue("@mobile", TextBox14.Text);
com.Parameters.AddWithValue("@mail", TextBox15.Text);
com.Parameters.AddWithValue("@sahmieh", DropDownList3.SelectedValue);
com.Parameters.AddWithValue("@noe", DropDownList2.SelectedValue);
com.Parameters.AddWithValue("@jensiat", DropDownList1.SelectedValue);
com.Parameters.AddWithValue("@shaghel", DropDownList4.SelectedValue);
try
{
com.ExecuteNonQuery();
}
catch (Exception ex)
{
if (ex.Message == "Violation of PRIMARY KEY constraint 'PK_personeli daneshjooyan'. Cannot insert duplicate key in object 'dbo.student'.The statement has been terminated.")
{
Label1.Visible = true;
return;
}
}
}

alisebt
شنبه 30 خرداد 1388, 01:38 صبح
خوب يه راهش اينه كه اول ID رو توي بانكت با يه Command چك كني. اگه وجود داشت پيغام خطا بده!

iman_22a
شنبه 30 خرداد 1388, 02:05 صبح
خوب يه راهش اينه كه اول ID رو توي بانكت با يه Command چك كني. اگه وجود داشت پيغام خطا بده!

منم همینو پیشنهاد میدم (Milade رو نمی دونم :چشمک:)

hobab-theme
شنبه 30 خرداد 1388, 03:05 صبح
خوب يه راهش اينه كه اول ID رو توي بانكت با يه Command چك كني. اگه وجود داشت پيغام خطا بده!
به نظر منم این روش خوب و بی دردسریه
چون خود منم از همین روش استفاده میکنم برای قسمت ثبت نام

javad.nic63
شنبه 30 خرداد 1388, 22:38 عصر
من id تكراري رو با فيلد در بانك وارد مي‌كنم و پيغامي كه در ex.massage نشون ميده همينه. ولي من ميخوام اين پيغام رو تبديل كنه به يك پيغامي كه كاربر بتونه بخونه.

karim orooji
یک شنبه 31 خرداد 1388, 02:06 صبح
من id تكراري رو با فيلد در بانك وارد مي‌كنم و پيغامي كه در ex.massage نشون ميده همينه. ولي من ميخوام اين پيغام رو تبديل كنه به يك پيغامي كه كاربر بتونه بخونه.

دوست عزيز به جاي ex.massage بيا اخطار مورد نظرت رو بنويس

javad.nic63
یک شنبه 31 خرداد 1388, 13:56 عصر
دوست عزيز به جاي ex.massage بيا اخطار مورد نظرت رو بنويس
اگر منظورت اينه كه به صورت كد زير بنويسم اين كار رو كردم ولي نتيجه نگرفتم.



try


{


com.ExecuteNonQuery();

}

catch (Exception ex)
{
if (ex.Message == "Violation of PRIMARY KEY constraint 'PK_personeli daneshjooyan'. Cannot insert duplicate key in object 'dbo.student'.The statement has been terminated.")
{
Label1.text = "شماره دانشجويي شما تكراري مي‌باشد";
return;
}

javad.nic63
چهارشنبه 03 تیر 1388, 15:17 عصر
تو رو خدا يكي جواب بده. من لازم دارم.

karim orooji
چهارشنبه 03 تیر 1388, 17:15 عصر
با سلام
دوست عزيز ميتوني با دستور (where ) اين كار رو انجام بدي

من يك برنامه درست كردم البته با زبان وي بي
شما بيا شرط بزار اگر يك فيلدي كه خيلي مهمه در برنامه مثلا( شماره شناسنامه )
اگر در موقع ثبت با تمام اون فيلد هاي ( شماره شناسنامه ) ثبت شده در بانك برابري كرد اخطار بده

karim orooji
چهارشنبه 03 تیر 1388, 17:17 عصر
جواد جان
كاري كه برنامه ات ميخواي انجام بده يك كامل برام بنويس

iman_22a
چهارشنبه 03 تیر 1388, 17:30 عصر
من id تكراري رو با فيلد در بانك وارد مي‌كنم و پيغامي كه در ex.massage نشون ميده همينه. ولي من ميخوام اين پيغام رو تبديل كنه به يك پيغامي كه كاربر بتونه بخونه.

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

hobab-theme
پنج شنبه 04 تیر 1388, 01:14 صبح
دوست من
من یه قسمت از کدی رو که برای صفحه ثبت نام کاربران نوشتم رو برات گذاشتم
البته هدف این کد تکراری نبودن username کاربر هست ولی شما میتونید اونو به هر فیلد دیگه ای تغییر بدید


Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If IsValid Then
Dim conSelect As SqlConnection
conSelect = New SqlConnection(ConfigurationManager.ConnectionStrin gs("Database").ConnectionString)
Dim username As String
Dim cmdSelect As SqlCommand
cmdSelect = New SqlCommand("SELECT username FROM members WHERE username = @username", conSelect)
cmdSelect.Parameters.AddWithValue("@username", txtUsername.Text)
Using conSelect
conSelect.Open()
username = cmdSelect.ExecuteScalar()
End Using
If username = txtUsername.Text Then
lblError.Visible = True
lblRegistration.Visible = False
Else
Dim conInsert As SqlConnection
conInsert = New SqlConnection(ConfigurationManager.ConnectionStrin gs("Database").ConnectionString)

توی این کد دو شرط رو بررسی میکنه:
ایتدا بررسی میکنه ببینه آیا username وارد شده توی تکست باکس txtUsername قبلاً ثبت شده یا خیر . اگر ثبت شده بود که lblError که یه کنترل Lable هست نمایش داده میشه . و در همین حال lblRegistration غیر قابل نمایش میشه ( توی هر کدام از این لیبل ها پیغامهای مناسبی تعبیه شده )
سپس اگر این نام کاربری آزاد بود که با یه کوئری دیگه مراحل ثبت نام رو دنبال میکنه
امیدوارم به کارت بیاد
موفق باشی

javad.nic63
جمعه 05 تیر 1388, 23:57 عصر
این روش اصلا خوب نیست . شما باید یک کلید اصلی توی جدول داشته باشی تا بتونی ورود اطلاعات تکراری رو کنترل کنی. بعدشم برای چک کردن داده تکراری که نمیان تمام فیلدها رو مقایسه کنن ! همه فیلدها که کلید شما نیستن . شما مثلا باید ID رو کلید بگیری و موقع ثبت ابتدا یک کوئری ساده جداگانه رو صدا کنی که ببینه ID موردنظر تکراری هست یا نه . اگر تکراری بود که پیغام بدی ولی اگه نبود به کاربر بگی چنین کاربری قبلا ثبت شده یا شناسه شما موردقبول نمی باشد .
دقيقاً من اين كار رو كردم و همينكه تو ميگي تنظيمش كردم. فقط همين پيغام كه sql به من ميده كه فيلد كليدم تكراري وارد شده من اون رو مي‌خوام براي كاربرم به صورت پيغام «اين كاربر قبلاً وارد شده است» نمايش بده. اگه لطف كنيد و دستورش رو بنويسيد ممنون ميشم.

javad.nic63
جمعه 05 تیر 1388, 23:59 عصر
دوست من
من یه قسمت از کدی رو که برای صفحه ثبت نام کاربران نوشتم رو برات گذاشتم
البته هدف این کد تکراری نبودن username کاربر هست ولی شما میتونید اونو به هر فیلد دیگه ای تغییر بدید


Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If IsValid Then
Dim conSelect As SqlConnection
conSelect = New SqlConnection(ConfigurationManager.ConnectionStrin gs("Database").ConnectionString)
Dim username As String
Dim cmdSelect As SqlCommand
cmdSelect = New SqlCommand("SELECT username FROM members WHERE username = @username", conSelect)
cmdSelect.Parameters.AddWithValue("@username", txtUsername.Text)
Using conSelect
conSelect.Open()
username = cmdSelect.ExecuteScalar()
End Using
If username = txtUsername.Text Then
lblError.Visible = True
lblRegistration.Visible = False
Else
Dim conInsert As SqlConnection
conInsert = New SqlConnection(ConfigurationManager.ConnectionStrin gs("Database").ConnectionString)

توی این کد دو شرط رو بررسی میکنه:
ایتدا بررسی میکنه ببینه آیا username وارد شده توی تکست باکس txtUsername قبلاً ثبت شده یا خیر . اگر ثبت شده بود که lblError که یه کنترل Lable هست نمایش داده میشه . و در همین حال lblRegistration غیر قابل نمایش میشه ( توی هر کدام از این لیبل ها پیغامهای مناسبی تعبیه شده )
سپس اگر این نام کاربری آزاد بود که با یه کوئری دیگه مراحل ثبت نام رو دنبال میکنه
امیدوارم به کارت بیاد
موفق باشی

دوست من! اين كد vb هستش و من اصلاً vb كار نكردم. با convertorهم نتونستم تبديلش كنم.

javad.nic63
شنبه 06 تیر 1388, 00:01 صبح
دوست من
من یه قسمت از کدی رو که برای صفحه ثبت نام کاربران نوشتم رو برات گذاشتم
البته هدف این کد تکراری نبودن username کاربر هست ولی شما میتونید اونو به هر فیلد دیگه ای تغییر بدید
Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If IsValid Then
Dim conSelect As SqlConnection
conSelect = New SqlConnection(ConfigurationManager.ConnectionStrin gs("Database").ConnectionString)
Dim username As String
Dim cmdSelect As SqlCommand
cmdSelect = New SqlCommand("SELECT username FROM members WHERE username = @username", conSelect)
cmdSelect.Parameters.AddWithValue("@username", txtUsername.Text)
Using conSelect
conSelect.Open()
username = cmdSelect.ExecuteScalar()
End Using
If username = txtUsername.Text Then
lblError.Visible = True
lblRegistration.Visible = False
Else
Dim conInsert As SqlConnection
conInsert = New SqlConnection(ConfigurationManager.ConnectionStrin gs("Database").ConnectionString)

توی این کد دو شرط رو بررسی میکنه:
ایتدا بررسی میکنه ببینه آیا username وارد شده توی تکست باکس txtUsername قبلاً ثبت شده یا خیر . اگر ثبت شده بود که lblError که یه کنترل Lable هست نمایش داده میشه . و در همین حال lblRegistration غیر قابل نمایش میشه ( توی هر کدام از این لیبل ها پیغامهای مناسبی تعبیه شده )
سپس اگر این نام کاربری آزاد بود که با یه کوئری دیگه مراحل ثبت نام رو دنبال میکنه
امیدوارم به کارت بیاد
موفق باشی
دوست من! اين كد vb هستش ومن اصلاً اينو كار نكردم. نتونستم با convertor هم به c# تبديلش كنم.

karim orooji
شنبه 06 تیر 1388, 00:02 صبح
با سلام
برادر عزيز اين سايت http://www.developerfusion.com/tools/convert/csharp-to-vb/
كار تبديل برنامه c به vb و يا بلعكس رو انجام ميده
واقعا كار راهندازه

javad.nic63
شنبه 06 تیر 1388, 00:08 صبح
با سلام
برادر عزيز اين سايت http://www.developerfusion.com/tools/convert/csharp-to-vb/
كار تبديل برنامه c به vb و يا بلعكس رو انجام ميده
واقعا كار راهندازه
به اين سايت هم رفتم نمي تونه تبديل كنه.

javad.nic63
شنبه 06 تیر 1388, 00:11 صبح
جواد جان
كاري كه برنامه ات ميخواي انجام بده يك كامل برام بنويس
من در sql شماره دانشجويي را كليد قرار دادم. حالا اگه توي c# در داخل textbox1 شماره دانشجويي تكراري وارد بشه پيغام زير رو در قسمت excutenonequery به من ميده.



Violation of PRIMARY KEY constraint 'PK_personeli daneshjooyan'. Cannot insert duplicate key in object 'dbo.student'.The statement has been terminated.
حالا ميخوام اين پيغام داده شده توسط c# رو به پيغامي واضح براي كاربرم تبديل كنم.
اگه فكر مي‌كني اين راه اشتباهه و راه ديگه‌اي بهتره به من بگو. ممنون

hobab-theme
شنبه 06 تیر 1388, 02:41 صبح
دوست من! اين كد vb هستش و من اصلاً vb كار نكردم. با convertorهم نتونستم تبديلش كنم.
متاسفانه منم #C کار نکردم . من این کد رو گذاشتم تا یه تصویر کلی از نحوه ی انجام کار دستتون بیاد
ولی اگه تونستم اینو براتون به #C تبدیل میکنم
موفق باشید

DataMaster
شنبه 06 تیر 1388, 14:24 عصر
پيشنهاد مي كنم اين كار رو توي پروسيجر SQL انجام بدين و پيام مناسب رو به C# برگشت بديد تا با همون كدي كه خودتون نوشتيد قابل استفاه است
توي SQL دنبال Raise Error باشيد

iman_22a
شنبه 06 تیر 1388, 18:28 عصر
دوست عزیز شما باید توی Try Catch بیای و Exception مربوط به این ارور را پیدا کنی و اگر همچین Exception ی اتفاق افتاد ، ارور مورد نظر مربوط به اون را به کاربر نمایش بدی .

hobab-theme
شنبه 06 تیر 1388, 21:34 عصر
دوستان یه لطفی کنن اگه #C کار کردن یه نمونه کد به این بنده خدا بدن . عاجز شد .
الان چند وقته گیره

adinochestva
شنبه 06 تیر 1388, 22:07 عصر
عجب جنجالیه



SqlConnection conn;
conn = New SqlConnection('db con string ...');

var cmd = New SqlCommand("SELECT userId FROM members WHERE userId = @userId", conn);
cmd.Parameters.AddWithValue("@userId", tbUserId.Text);

conn.Open();
if (cmdSelect.ExecuteScalar() == tbUserId.Text)
//this code does already exist
else
// lol great :D

conn.Close();

javad.nic63
شنبه 06 تیر 1388, 23:33 عصر
دوستان خيلي لطف كردين!
بالاخره خودم كدش رو پيدا كردم و كار كرد. از همتون ممنون
ضمناً از adinochestva (http://barnamenevis.org/forum/member.php?u=73608) تشكر مي‌كنم كه كدش شبيه كد خودم بود . اينم كد خودم:






SqlCommand cmd = newSqlCommand("select id from student where id=" + TextBox1.Text + "", conn);


SqlDataReader dr = cmd.ExecuteReader();

if (dr.Read())
{
Label1.Text = "شماره دانشجويي تكراري است.";
dr.Close();
return;
}
else







{



dr.Close();


formcontrol();

student_info();

saeedr22
شنبه 06 تیر 1388, 23:57 عصر
اگه از sqlserver استفاده مکنی بهتر که توش از trriger ها کمک بگیری..

javad.nic63
یک شنبه 07 تیر 1388, 00:32 صبح
اگه از sqlserver استفاده مکنی بهتر که توش از trriger ها کمک بگیری..
من تا حالا از trriger استفاده نكردم. ميتوني بيشتر بهم توضيح بدي.

hobab-theme
یک شنبه 07 تیر 1388, 02:00 صبح
دوستان خيلي لطف كردين!
بالاخره خودم كدش رو پيدا كردم و كار كرد. از همتون ممنون

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

saeedr22
دوشنبه 08 تیر 1388, 14:41 عصر
من تا حالا از trriger استفاده نكردم. ميتوني بيشتر بهم توضيح بدي.

تو sql server که دقیقاً نمیدونم 2000 پشتیبانی میکنه یا نه به هر حال 2005 پشتیبانی می کنه
مییایی یکسری از خطاها رو تو خوده sql server کنترل می کنه ..
یعنی واسه هر جدول یکسری کنترل هایی رو اعمال میکنی و بعد میگی اگه این قوانین رعایت نشدن خطای مورد نظر شما ارسال بشه ...

javad.nic63
دوشنبه 15 تیر 1388, 03:59 صبح
خدارو شکر عزیز بالاخره به چیزی که میخواستی رسیدی:تشویق:
ولی همینجا ولش نکن . یعنی این کد رو همینجوری ننویس و خلاص . سعی کن اونو ارتقاء بدی و بهترش کنی
یا حق
حتماً. اين كد خيلي جاهاي ديگه به درد مي‌خوره.
من خيلي جاها ازش استفاده كردم.

mahmoudi61
سه شنبه 09 فروردین 1390, 12:53 عصر
سلام

یکی از حالت هایی که این خطا صادر می شود این است که جدولی با فیلد کلید که Identityt آن فعال است داریم و رکوردی داخل آن است و ما این جدول را با دستور reset موجود در SQL رست می کنیم و وقتی می خواهیم رکورد جدیدی را درج کنیم این خطا صادر می شود. برای جلوگیری از این کار نباید reset کنیم. :چشمک: