PDA

View Full Version : چرا دستور زیر try نیمشه؟



mehdiba3
یک شنبه 17 شهریور 1392, 12:14 عصر
سلام دوستای خوبم
یک سوال داشتم که شاید بدرد خیلیا بخوره جوابش

یک قسمت از برنامه ای که در حال نوشتن آن هستم پرداخت پول هستش. هر نفر باید فقط یک بار بتونه پول رو پرداخت کنه و اگه بار بعد با همون مشصات کسی خواست پول پرداخت کنه سیستم بهش باید پیغام خطا بده

ایده ای که به ذهن من رسید این بود که برنامه بره تو دیتابیس رو چک کنه یک فیلد flag تعریف کردم که null هستش. وقتی کاربر عملیات پرداخت رو انجام میده این فیلد flag =true بشه . و بار بعدی اگه اشتباهی همین مشخصات خواست عملیات پرداخت رو انجام بده ابتدا فیلد flag چک بشه اگه مخالف true بود ثبتش کنه و flag =trueبشه .

این نظر من بودش. برنامشم نوشتم ولی اصلا try نیمشه . یعنی مشکل اینجاست که من تو عملیات try catch یکم مشکل دارم.
میشه شما راهنماییم کنید چرا برنامه در مرحله try متوقف میشه و هیچ کاری انجام نمشه؟ شما ایده ای دیگر برای این کار دارید؟
اینم کدش هست:



private void shahriyeh()
{
try
{
string flag =" select flag from shahriyeh where flag<> true ";
var dr = bnk.exereader(flag);
if (dr.Read())
{

string str =
"insert into shahriyeh(scodemeli,cno,sno,price,date,flag) values(@scodemeli,@cno,@sno,@price,@date,'1')";

SqlConnection a =
new SqlConnection("data source=.; initial catalog=academy;integrated security=true");

a.Open();
SqlCommand b = new SqlCommand();
b.Connection = a;
b.CommandText = str;
b.Parameters.AddWithValue("@scodemeli", txtcod.Text);
b.Parameters.AddWithValue("@cno", cno.Text);
b.Parameters.AddWithValue("@sno", sno.Text);
b.Parameters.AddWithValue("@price", txtprice.Text);
b.Parameters.AddWithValue("@date", uc1.VDate);


b.ExecuteNonQuery();
a.Close();
MessageBox.Show("ثبت شد");

}

}
catch (Exception)
{
dateshahriye();
MessageBox.Show("در تاریخ" +" "+ lbldate.Text + "شهریه پرداخت شده است","خطا",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}

fjm11100
یک شنبه 17 شهریور 1392, 12:25 عصر
یعنی چی؟سوالت گنگه؟ یعنی تا ته try نمیره و میره تو catch؟

mehdiba3
یک شنبه 17 شهریور 1392, 12:28 عصر
یعنی چی؟سوالت گنگه؟ یعنی تا ته try نمیره و میره تو catch؟
اره
میره تو catch

ghasemloo
یک شنبه 17 شهریور 1392, 12:34 عصر
دستور try , catch
و محتویات catchبردار
و دستورات داخل try رو اجرا کن و پیغام خطا رو بزار ببینیم

mehdiba3
یک شنبه 17 شهریور 1392, 12:44 عصر
try catch را برداشتم ولی اصلا عملیاتی صورت نمیگیره . احتمال زیاد اشکال در دستور string flag =" select flag from shahriyeh "; هستش . انگار هیچ وقت درست نیست دستور که وقتی exereader میشه درست نیست شرط


string flag =" select flag from shahriyeh ";
var dr = bnk.exereader(flag);
if (dr.Read())
{

string str =
"insert into shahriyeh(scodemeli,cno,sno,price,date,flag) values(@scodemeli,@cno,@sno,@price,@date,'1')";

SqlConnection a =
new SqlConnection("data source=.; initial catalog=academy;integrated security=true");

a.Open();
SqlCommand b = new SqlCommand();
b.Connection = a;
b.CommandText = str;
b.Parameters.AddWithValue("@scodemeli", txtcod.Text);
b.Parameters.AddWithValue("@cno", cno.Text);
b.Parameters.AddWithValue("@sno", sno.Text);
b.Parameters.AddWithValue("@price", txtprice.Text);
b.Parameters.AddWithValue("@date", uc1.VDate);


b.ExecuteNonQuery();
a.Close();
MessageBox.Show("ثبت شد");

}

sohil_ww
یک شنبه 17 شهریور 1392, 12:47 عصر
هر نفر باید فقط یک بار بتونه پول رو پرداخت کنه

بزار چند بار بدن خوب مگه ایراد داره :لبخندساده:


true رو با حرف بزرگ بنویس True

Sql به کوچک و بزرگ بودن حروف حساس نیست

و در کل وقتی ما از try و Catch استفاده می کنیم موقعی که مشکلی تو برنامه باشه برنامه به سراغ catch می ره و توابع اونو اجرا می کنه پس برنامتون یه جایش میشکل داره شما با حذف Try و catch یا خوندن متن ارور catch بتونی مشکلو رفع کنی

mehdiba3
یک شنبه 17 شهریور 1392, 13:04 عصر
بله درست میگین.
مشکل از کوئریتونه. به این صورت بنویسین
string flag =" select flag from shahriyeh where flag<> 'true' ";


string flag =" select flag from shahriyeh where flag<> 'true' ";




این کار رو کردم ولی اصلا چیزی اجرا نیمشه یعنی ثبت نیمشه داده ها و اینکه خطا هم نمدیه.

عجیبه!!

sohil_ww
یک شنبه 17 شهریور 1392, 13:08 عصر
می تونی برنامه رو قرار بدی ؟!
بررسی کنیم ؟

rezaei_y
یک شنبه 17 شهریور 1392, 13:29 عصر
با سلام
دوست عزیز flag رو از چه نوعی تعریف کردی؟؟

درست اینه که از نوع bit با مقدار پیش فرض false یا همون 0 تعریف کنی یعنی تمامی رکوردها در ابتدا مقدار false رو خواهند داشت برای بررسی شرط هم کافیه بنویسی
select * from tbname where flag<>1

mehdiba3
یک شنبه 17 شهریور 1392, 14:05 عصر
string flag =" select flag from shahriyeh where flag<>1" ;



این کارو کردم. به نتیجه ای نرسیدم

تو برنامه sql فیلد flag را در قسمت defult or value of bending برابر 0 قرار دادم.
این کارم درسته؟

شما روش دیگه ای به نظرتون نمیرسه؟

یک توضیح مختصر این که با دستور [ string flag =" select flag from shahriyeh where flag<>1" ;
var dr = bnk.exereader(flag);
if (dr.Read())
/CSHARP] در بانک اطلاعاتی فیلد flag چک میشه اگه مخالف 1 بود (یعنی 0) به این معناس که تا الان این مشتری اطلاعاتش ثبت نشده و میره سراغ دستور [CSHARP]if (dr.Read())
{

string str =
"insert into shahriyeh(scodemeli,cno,sno,price,date,flag) values(@scodemeli,@cno,@sno,@price,@date,'1')";

SqlConnection a =
new SqlConnection("data source=.; initial catalog=academy;integrated security=true");

a.Open();
SqlCommand b = new SqlCommand();
b.Connection = a;
b.CommandText = str;
b.Parameters.AddWithValue("@scodemeli", txtcod.Text);
b.Parameters.AddWithValue("@cno", cno.Text);
b.Parameters.AddWithValue("@sno", sno.Text);
b.Parameters.AddWithValue("@price", txtprice.Text);
b.Parameters.AddWithValue("@date", uc1.VDate);


b.ExecuteNonQuery();
a.Close();
MessageBox.Show("ثبت شد");

} و با این کار اطلاعات در جدول shahriyeh ثبت میشه و فیلد flag=1 میشه.
تمام کارم درسته از نظر دستوری

عجیبه هیچ عملی صورت نمیگیره. نه خطا میده و نه اجرا میشه.
خخخخخخخخخخخخخخخ

fjm11100
یک شنبه 17 شهریور 1392, 16:20 عصر
توی catch اینو بنویس و پیامی که نشون میده را بزار اینجا
catch (Exception e) {
MessageBox.Show(e.Message);
}

mehdiba3
یک شنبه 17 شهریور 1392, 17:11 عصر
توی catch اینو بنویس و پیامی که نشون میده را بزار اینجا
catch (Exception e) {
MessageBox.Show(e.Message);
}
این کارو کردم ولی باز هیچ پیامی نداد

fjm11100
یک شنبه 17 شهریور 1392, 18:54 عصر
بریک پوینت بزار ببین اصلا میره تو catch بعد که رفت برو رو کلمه catch با ماوس ببین پیامش چیه