PDA

View Full Version : سوال: متوقف کردن برنامه بعد از بروز خطا



god of war
شنبه 23 خرداد 1394, 01:50 صبح
دوستان سلام
به این کدها توجه کنید لطفا
این قطعه کد برای لایه data هست که یه دستور رو اجرا میکنه :

public void execute(string query)
{
try
{
connect();
sqlCmd.CommandText = query;
sqlCmd.CommandType = System.Data.CommandType.Text; ;
sqlCmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
if (sqlCon.State == System.Data.ConnectionState.Open)
disconnect();
}
}


این هم ساخت query در لایه تجاری


public void insert()
{
string query = "insert into customer (name,nickName,type,number,address,discount,firstD ate,postalCode,fax,creditLimit,lastName)";
query += " values (N'{0}',N'{1}','{2}','{3}',N'{4}','{5}','{6}','{7} ','{8}','{9}',N'{10}')";
query = string.Format(query, name, nickName, type, number, address, discount, date, postal, fax, creditLimit,lastname);
dataAccessLayer.execute(query);
}


و در نهایت لایه نمایش این قطعه کد :


Customer cst = new Customer(txtName.Text , txtLastName.Text, txtNickName.Text, txtAddress.Text, txtPostalCode.Text, txtNumber.Text, txtFax.Text, date, (int)t, Convert.ToInt32(txtDiscount.Text), txtProNet1.Text);
cst.insert();
if (!chkAccountInfo.Checked)
MessageBox.Show("اطلاعات عمومی طرف حساب ثبت شد");



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

En_MK
شنبه 23 خرداد 1394, 02:10 صبح
شما یاباید از return استفاده کنید یا اینکه متد insert که نوشتید یه خروجی از نوع int داشته باشه که برابر با id رکوردی باشه که در دیتابیس ذخیره شده
ودر لایه ui چک کنید اگر این مقدار برابر منفی یک بود هیچکاری نکنید در غیر اینصورت بقیه کارهارو...

god of war
شنبه 23 خرداد 1394, 02:20 صبح
شما یاباید از return استفاده کنید یا اینکه متد insert که نوشتید یه خروجی از نوع int داشته باشه که برابر با id رکوردی باشه که در دیتابیس ذخیره شده
ودر لایه ui چک کنید اگر این مقدار برابر منفی یک بود هیچکاری نکنید در غیر اینصورت بقیه کارهارو...
سلام
داخل لایه data بعد داخل بلاک catch بعداز messagebox که نمایش دادم return گذاشتم اما عمل نکرد
دقیقا کجا از return استفاده کنم
با توجه به اینکه فقط یه متد insert نیست متدهای دیگه هم هست . این صرفا نمونه بود

shadi khanum
شنبه 23 خرداد 1394, 07:12 صبح
تابع execute رو خروجیش رو bool بذار و وقتی رفت توی catch بعد از پیغامی که میدی return false کن و بعد از sqlCmd.ExecuteNonQuery();بنویس return true
تابع insert رو هم باز به جای void، خروجیش رو bool بذار و اینجوری تغییرش بده

string query = "insert into customer (name,nickName,type,number,address,discount,firstD ate,postalCode,fax,creditLimit,lastName)";

query += " values (N'{0}',N'{1}','{2}','{3}',N'{4}','{5}','{6}','{7} ','{8}','{9}',N'{10}')";

query = string.Format(query, name, nickName, type, number, address, discount, date, postal, fax, creditLimit,lastname);
bool res = false;

res=dataAccessLayer.execute(query);
return res;



کد قسمت بعد رو هم اینجوری تغییر بده

Customer cst = new Customer(txtName.Text , txtLastName.Text, txtNickName.Text, txtAddress.Text, txtPostalCode.Text, txtNumber.Text, txtFax.Text, date, (int)t, Convert.ToInt32(txtDiscount.Text), txtProNet1.Text);
bool res=false;

res=cst.insert();

if ( res && !chkAccountInfo.Checked)

MessageBox.Show("اطلاعات عمومی طرف حساب ثبت شد");

god of war
شنبه 23 خرداد 1394, 13:36 عصر
تابع execute رو خروجیش رو bool بذار و وقتی رفت توی catch بعد از پیغامی که میدی return false کن و بعد از sqlCmd.ExecuteNonQuery();بنویس return true
تابع insert رو هم باز به جای void، خروجیش رو bool بذار و اینجوری تغییرش بده

string query = "insert into customer (name,nickName,type,number,address,discount,firstD ate,postalCode,fax,creditLimit,lastName)";

query += " values (N'{0}',N'{1}','{2}','{3}',N'{4}','{5}','{6}','{7} ','{8}','{9}',N'{10}')";

query = string.Format(query, name, nickName, type, number, address, discount, date, postal, fax, creditLimit,lastname);
bool res = false;

res=dataAccessLayer.execute(query);
return res;



کد قسمت بعد رو هم اینجوری تغییر بده

Customer cst = new Customer(txtName.Text , txtLastName.Text, txtNickName.Text, txtAddress.Text, txtPostalCode.Text, txtNumber.Text, txtFax.Text, date, (int)t, Convert.ToInt32(txtDiscount.Text), txtProNet1.Text);
bool res=false;

res=cst.insert();

if ( res && !chkAccountInfo.Checked)

MessageBox.Show("اطلاعات عمومی طرف حساب ثبت شد");




ممنون
یعنی راه دیگه نداره پس ؟
حتما باید به این شکل عمل کنم ؟
چون بنظر منطقی نیس آخه
الان من تو ی تابع دیگه datatab;le برمیگردونم و نمیشه bool باشه
کاش راهی بود که تو هیمن لایه data بشه متوقف کردش