PDA

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



reza3reza3
پنج شنبه 03 دی 1388, 11:15 صبح
سلام
یه فرم دارم با چند کنترل برای وارد کردن اطلاعات جدید،همه کنترلها به غیر از textbox اول که مربوط به کد پرسنلی یا شماره است غیر فعال هستند،می خواهم وقتی خواستیم اطلاعات جدید وارد کنیم ابتدا شماره پرسنلی را وارد کرده و اگر شماره تکراری بود پیغامی مبنی بر تکراری بودن ویا کاری انجام ندهد ولی اگر تکراری نبود بقیه کنترلها برای وارد کردن دیگر اطلاعات فعال بشن.
چه کدی برای فهمیدن رکورد تکراری در بانک باید بنویسم.

slashslash2009
پنج شنبه 03 دی 1388, 11:27 صبح
باید ببینی که قبلا وارد شده یا نه با یک دستور select میشه این کارو کرد اگر table خالی بود یعنی قبلا وارد نشده در غیر اینصورت قبلا وارد شده :

connect con = new connect();
DataTable dtn = new DataTable();
dtn = con.MySelect("Select * from table1 where name='" + textBox1.Text + "'");
if (dtn.Rows.Count == 0)
{

asefy2008
پنج شنبه 03 دی 1388, 11:48 صبح
1.سلام شما مگه فیلد مربوط به کد پرسنلیتو کلید نگرفتی؟
2.با اطلاعات کم من فکر خود برنامت باید کد پرسنلی رو درست کنه نه این کاربر به اون بده(شاید هم اشتباه می کنم .)چون در تعداد زیاد به مشکل بر خواهید خورد فرض کن شما 10000رکورد داری و کاربر بخواد کد پرسنلی بهش بده خیلی خوشبینانه باید در هر بار 4یا 5 دفعه سیستم بهش پیغام خطا بده و ... .
3.ما هیچ شناختی از سیستمی که شما می نویسی و دیتابیسی که طراحی کردی نداریم تا بتونیم راه حل مناسب رو به شما پیشنهاد کنیم(به نظر میاد شما راه رو داری اشتباه میری)

reza3reza3
پنج شنبه 03 دی 1388, 14:45 عصر
با تشکر
من می خواهم اگر فیلد تکراری بود دکمه های ویرایش و حذف فعال و اطلاعاتی که مربوط به این کد است در textboxها نمایش داده بشن،ولی اگه کد تکراری نبود کنترل ثبت برای وارد کردن اطلاعات جدید فعال و بقیه textboxها به صورت خالی فعال بشن

لطفا راهنمایی کنید به چه صورت این کار رو انجام بدم.

Nima NT
پنج شنبه 03 دی 1388, 14:50 عصر
اصولي ترين راه همون طوري كه دوستمون هم گفتن اين هست كه فيلد كد پرسنلي رو به عنوان كليد اصلي ( Primary key ) در نظر بگيريد ؛ اين طوري حتي اگر بخواهيد كد تكراري وارد كنيد سيستم پايگاه داده مورد استفاده شما اجازه اين كار رو نميده.

slashslash2009
پنج شنبه 03 دی 1388, 16:11 عصر
با تشکر
من می خواهم اگر فیلد تکراری بود دکمه های ویرایش و حذف فعال و اطلاعاتی که مربوط به این کد است در textboxها نمایش داده بشن،ولی اگه کد تکراری نبود کنترل ثبت برای وارد کردن اطلاعات جدید فعال و بقیه textboxها به صورت خالی فعال بشن

لطفا راهنمایی کنید به چه صورت این کار رو انجام بدم.

مشکل شما در کد نویسی نیست در الگوریتم است که خودتون باید حلش کنید اگه اینجوری بهتون کمک کنند در هر مرحله از کارتون دوباره اینجوری سوال میکنید جواب شما در خود سوال است یکمی دقت کنید من حتی کد تست تکراری بودن رکوردو براتون گذاشتم

reza3reza3
پنج شنبه 03 دی 1388, 17:40 عصر
البته در بانک برای فیلد دیگه ای کلید اصلی تعریف کردم ،ولی فقط این نیست که بخواهم کد پرسنلی وارد کنم و بخوام تکراری نباشه ،مواقعی پیش می آید که چند فیلد مهم میشه مثل نام رشته،شماره دانشجویی ،شماره کد ملی ،نام فیلم ... در برنامه های دیگه که تکراری است و کاربر بنا به صلاحدید باید متوجه بشه.


کدی که جناب slashslash2009 زحمت کشیدند در قسمت MySelect برنامه خطا می گیره.MySelect رو به چه صورت تعریف کنم.

slashslash2009
پنج شنبه 03 دی 1388, 17:48 عصر
دوست من myselect یک تابع است که من کانکشن استرینگمو و بقیه چیزای اتصال به بانکو توش گذاشتم شما از دستور select ش در برنامه خودتون استفاده کنید
("Select * from table1 where name='" + textBox1.Text + "'");

شما این کدو استفاده کنید و اون تیبلی که به دست میاد رو چک کنید :

if (dtn.Rows.Count == 0)

asefy2008
پنج شنبه 03 دی 1388, 18:41 عصر
ببین دوست من شما گویا به یکباره اومدی و table هات رو ساختی و اصلا طراحی برای اون انجام ندادی (بهتر بگم مطلبی در مورد اصول طراحی پایگاه نخوندی .)در نتیجه دچار مشکل شدی.
موفق باشی

notelo
پنج شنبه 03 دی 1388, 18:45 عصر
سلام دوست عزیز
شما میتونی از تابع Exists درون sql استفاده کنی به این صورت که...

sqlcommand cmd=new sqlcommand("IF EXISTS(SELECT * FROM TABLE WHERE ID=@ID)SELECT 1 ELSE SELECT 0",new sqlconnection("connectionstring"))
cmd.parameters.addwithvalue("@id",textbox1.tex)

cmd.connection.open()

bool b = convert.toboolean(cmd.executescalar())

cmd.connection.close()
حال از b برای شرط استفاده کن

reza3reza3
پنج شنبه 03 دی 1388, 22:53 عصر
دوست من myselect یک تابع است که من کانکشن استرینگمو و بقیه چیزای اتصال به بانکو توش گذاشتم شما از دستور select ش در برنامه خودتون استفاده کنید
("Select * from table1 where name='" + textBox1.Text + "'");

شما این کدو استفاده کنید و اون تیبلی که به دست میاد رو چک کنید :

if (dtn.Rows.Count == 0)


اگه امکان داره کد کامل رو بزارید.

oracler
شنبه 05 دی 1388, 02:27 صبح
سلام
تقریبا پاسخ تمامی دوستان درسته، ولی فکر میکنم روش دوستم notelo از همه جالبتر و مهندسی تره.
من کدشو بازسازی کردم:

SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|\\YourDbName.mdf;Integrated Security=True");
SqlCommand cm;
private void button1_Click(object sender, EventArgs e)
{
cm = new SqlCommand("IF EXISTS(SELECT * FROM yourTableName WHERE id=@id) SELECT 1 ELSE SELECT 0", con);
cm.Parameters.AddWithValue("@id",textBox1.Text);

con.Open();
bool b = Convert.ToBoolean(cm.ExecuteScalar());
con.Close();

if (b)
MessageBox.Show("This number now exists! try again");
else
MessageBox.Show("Ok, you can add this record.");
}
Tested by VS2005

HOSEAIN_R
سه شنبه 20 بهمن 1394, 15:48 عصر
سلام،خسته نباشین ،من میخوام از تکراری وارد کردن اطللاعات نام و تلفن توی بانک اسکیوال سرور جلوگیری کنم، اینم کدمه ولی فقط اگه فیلد انگلیسی باشه درست کار میکنه! واسه شماره تلفن هم که اصلا کار نمیکنه،میشه راهنمایی کنید


SqlConnection cnn4 = newSqlConnection(cnnct);


string Query4 = "select * from Tb_Moshtari where Cname='" + Name_txt.TextValue + "'";


SqlCommand cmd4 = newSqlCommand(Query4, cnn4);

cnn4.Open();


SqlDataReader dr4 = cmd4.ExecuteReader();


if (dr4.HasRows == true)

{

dr4.Read();


string NAME = dr4["Cname"].ToString();


if (NAME == Name_txt.Text)

{


FarsiMessage.Show("نام استفاده شده تکراری میباشد");

Name_txt.Focus();


return;

}


}

cnn4.Close();



SqlConnection cnn5 = newSqlConnection(cnnct);


string Query5 = "select * from Tb_Moshtari where Phone='" + TelSabet_txt.Text + "'";


SqlCommand cmd5 = newSqlCommand(Query4, cnn4);

cnn4.Open();


SqlDataReader dr5 = cmd4.ExecuteReader();


if (dr5.HasRows == true)

{

dr5.Read();


string PHONE = dr5["Phone"].ToString();


if (PHONE == TelSabet_txt.Text)

{


FarsiMessage.Show("شماره تلفن وارد شده قبلا ثبت شده است");

TelSabet_txt.Focus();
return;

}


}

cnn5.Close();

HOSEAIN_R
سه شنبه 20 بهمن 1394, 15:56 عصر
سلام،خسته نباشین ،من میخوام از تکراری وارد کردن اطللاعات نام و تلفن توی بانک اسکیوال سرور جلوگیری کنم، اینم کدمه ولی فقط اگه فیلد انگلیسی باشه درست کار میکنه! واسه شماره تلفن هم که اصلا کار نمیکنه،میشه راهنمایی کنید

[CSHARP ]
SqlConnection cnn4 = newSqlConnection(cnnct);
string Query4 = "select * from Tb_Moshtari where Cname='" + Name_txt.TextValue + "'";
SqlCommand cmd4 = newSqlCommand(Query4, cnn4);
cnn4.Open();
SqlDataReader dr4 = cmd4.ExecuteReader();
if (dr4.HasRows == true)
{
dr4.Read();
string NAME = dr4["Cname"].ToString();
if (NAME == Name_txt.Text)
{
FarsiMessage.Show("نام استفاده شده تکراری میباشد");
Name_txt.Focus();
return;
}
}
cnn4.Close();