PDA

View Full Version : سوال: مشکل در اجرای حذف رکورد



جوان ایرانی
یک شنبه 31 فروردین 1393, 18:32 عصر
باسلام
من کد حذف کاربر را در برنامه ام به این شکل نوشتم مشکلش اینست که وقتی کاربری وجود نداره بازهم پیغام میده"حذف با موفقیت انجام شد"
به نظرتون منطق کدم مشکل داره؟

//حذف کاربر......
private void button1_Click(object sender, EventArgs e)
{
DialogResult result;
result = MessageBox.Show("آیا مطمئن هستید که رکورد حذف شود", "",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning,MessageBoxDefaultButton.But ton2);
if (result == DialogResult.Yes)
{
try
{
string sql1 = "delete from libUser where ucode="+txtucode.Text.Trim();
con1 = new SqlConnection(s);
cmd1 = new SqlCommand(sql1, con1);

con1.Open();
cmd1.ExecuteNonQuery();
txtucode.Clear();

MessageBox.Show("حذف با موفقیت انجام شد");
}
catch
{
MessageBox.Show("چنین کاربری موجود نیست");
}
}
}

kurdboy2175
یک شنبه 31 فروردین 1393, 18:39 عصر
ببین تو قسمت بالای کد های یه if اضافه کن
اینجوری
if(txtcode.text=="")

{
messabox.show("شما هیچ گزینه ای را انتخاب نکرده اید");
return;
}

جوان ایرانی
یک شنبه 31 فروردین 1393, 18:49 عصر
ممنون از جوابت
ولی textbox خالی نیست
منظورم اینه که مثلا کاربر میزنه کد 400 حذف بشه درحالی که تو پایگاه همچین کدی وجود نداره
برنامه من در این شرایط هم میگه حذف شد.

kurdboy2175
یک شنبه 31 فروردین 1393, 19:00 عصر
خوب
قبلش یه دستور select بنویس بر اساس کد
اگه وجود داشت حذف بشه اگه هم وجود نداشت بنویسه چنین چیزی تو پایگاه وجود نداره یه چیزی مثل این
select * from libUser where ucode="+txtucode.Text.Trim();

جوان ایرانی
یک شنبه 31 فروردین 1393, 19:19 عصر
الان این کار رو کردم البته مطمئن نیستم همون جوری که مدنظر شما بود انجام دادم یا نه
ولی بازهم با این که کد وجود نداشت گفت حذف شد:متعجب:

البته قانع نمیشم که دستور delete نتونه تشخیص بده و نیاز به select باشه
من اینطوری نوشتم چون فکر کردم اگه select میتونه تشخیص بده پس میفهمه و قبل از delete میره تو exception که باید بگه "وجود نداره"
string sql1 = "select * from libUser where ucode=" + txtucode.Text.Trim();
string sql2 = "delete from libUser where ucode=" + txtucode.Text.Trim();
con1 = new SqlConnection(s);
cmd1 = new SqlCommand(sql1, con1);
cmd2 = new SqlCommand(sql2, con1);

con1.Open();
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();

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

mehrdad.ghorbaniyan
یک شنبه 31 فروردین 1393, 20:24 عصر
سلام.دوست عزیز شما اول چک کن ببین رکوردی با این ucode وجود داره بعد عملیات حذف را انجام بده
با کد زیر میتونی تعداد رکوردهایی که میخوایی را بدست بیاری بعد بگو اگه بیشتر از 1 بود بره سراغ عملیات حذف


private int count(string strsql)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename="+Application.StartupPath+"\\restoran.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
con.Open();

SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = strsql;
int a=Convert.ToInt16(cmd.ExecuteScalar());
con.Close();
return a;
}
if (count("SELECT COUNT(*) FROM libUser WHERE ucode=" + txtucode.Text.Trim())>0)
}
// عملیات حذف
{

rg_BlackRose
یک شنبه 31 فروردین 1393, 21:18 عصر
سلام

یک توضیح مختصر در مورد متد ExecuteNonQuery (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery%2 8v=vs.110%29.aspx) مربوط به SqlCommand (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx) میدم و مشکل کد شما رو عرض میکنم.

این تابع از SqlCommand (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx) در عملیاتی مانند Delete (http://msdn.microsoft.com/en-us/library/6kt4x6zx%28v=vs.80%29.aspx) تعداد سطرهایی رو که عمل حذف رو در اون انجام داده برگشت میده. و شما باید از این قابلیت SqlCommand (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx) استفاده بکنید.

1-اگر شما 2 تا رکورد داشته باشید که مثلا فیلد کد کاربری اونها با هم یکسان باشند(بر فرض مثال '123' بر حسب اتفاق) و شما با کوئری زیر اقدام به حذف رکوردهایی بکنید که کد کاربری اونها '123' باشه
"DELETE * From TableName WHERE ucode='123'"

متد ExecuteNonQuery هر دو رکورد موجود در جدول دیتابیس شما رو که فیلد کد کاربری اونها '123' هست رو حذف میکنه و عدد 2 رو برگشت میده.

2-اگر از کوئری زیر استفاده کنید.
"DELETE From TableName WHERE ucode='123'"

متد ExecuteNonQuery (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery%2 8v=vs.110%29.aspx) اولین رکورد از جدول دیتابیس شما رو که فیلد کد کاربری اون '123' هست رو حذف میکنه و عدد 1 رو برگشت میده.

3-اگر رکورد مورد نظر در دیتابیس وجود نداشته باشه عدد 0 رو برگشت میده.(بدون تولید خطا - یعنی کدها رو تا آخرانجام میده بدون اینکه رکوردی رو حذف بکنه و یا خطا تولید بکنه)

4-در غیر این صورت عدد -1 رو برگشت میده و یا اقدام به تولید خطا میکنه.

و اما ایراد کار شما:

با توجه به توضیحات بالا مشکل کد شما مربوط به توضیح شماره 3 میشه

بنابر این من برای رفع این مشکل کدهای شما رو به صورت زیر تغییر دادم.


private int Delete_User(string usercode)
{
int result = -1;

using(SqlConnection conn= new SqlConnection(s))
{
using(SqlCommand com = new SqlCommand("DELETE FROM libUser WHERE ucod=@ucode",conn))
{
com.Parameters.Add("@ucode", SqlDbType.NVarChar).Value = usercode;

try
{
conn.Open();
result = com.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show("خطا در حذف کاربر \n" + ex.Message);
result = -1;
}
}
}

return result;
}

private void button1_Click(object sender, EventArgs e)
{
DialogResult result;
result = MessageBox.Show("آیا مطمئن هستید که رکورد حذف شود", "",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning,MessageBoxDefaultButton.But ton2);
if (result == DialogResult.Yes)
{
int iResult = Delete_User(txtucode.Text.Trim());

if(iResult == 0)
{
MessageBox.Show("کاربری با کد مورد نظر تعریف نشده است");
}
else if (iResult >= 1)
{
MessageBox.Show("حذف کاربر(ان) با موفقیت انجام شد");
}
}
}


اگر لازم دیدید پیغام بدید تا خط به خط کدهای بالا رو توضیح بدم.

و در نهایت جند تا توصیه جهت خوانایی بهتر کدهای برنامه:

1- برای اقدام به انجام عملیاتی نظیر Insert,Update,Delete برای هر کدام یک تابع بنویسد
2- برای اقدام به انجام عملیاتی نظیر Select,Insert,Update,Delete از پارامترها (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters%28v=vs .110%29.aspx) در SqlCommand استفاده کنید.
3- برای اقدام به انجام عملیاتی نظیر Insert,Update,Delete کانکشن و یا ملزومات مورد نیاز برا کار با دیتابیس رو درون خود تابع تعریف کنید.
4- وقتی کارتون با جداول دیتابیس تمام شد Connection رو Close کنید.


موفق باشید.

یا حق