PDA

View Full Version : تشخیص اینکه رکورد ثبت شده یا نه



m_karimi
جمعه 05 آبان 1396, 21:15 عصر
برای تشحیص اینکه cmd.ExecuteNonQuery(); رکوردی برمیگرداند یا نه باید چه شرطی بگذاریم؟
من شرط if(cmd.ExecuteNonQuery()>0) را گذاشتم ولی در catch می رود
من میخواهم شرط بگذارم که اگر رکورد با موفقیت حذف، اضافه و یا اپدیت شد، پیغام موفقیت امیز دهد.

در مورد executreader هم همین طور چه شرطی بگذاریم؟

محمد آشتیانی
جمعه 05 آبان 1396, 22:53 عصر
سلام
متد ExecuteNonQuery بعنوان خروجی یک عدد (int) برمیگردونه که نشونه تعداد ردیف هایی هست که با اجرای کوئری شما تغییر کردن (اضافه ، آپدیت و یا حذف شدن)
یعنی اگر شما با Insert یک رکورد اضافه کنید و با موفقیت ثبت بشه ، نتیجه اجرای متد فوق عدد 1 خواهد بود

احتمالا دلیل رفتن به Catch اینه که کوئری شما مشکلی داره و اساسا موقع ثبت به خطا برمیخوری


تکمیلی:
هیچوقت بلوک Catch و Exception رو به امان خدا ول نکنید ، کمترین کاری که میشه کرد اینه که متن استثنای رخ داده رو داخل یک MessageBox نمایش بدید تا لااقل متوجه بشید به دلیل چه خطایی سر از اونجا درآوردید :)

بنده دیدم خیلی دوستان به این شکل می نویسند
try {
//کدهای شما
}
catch (Exception exception)
{


}

یا مثلا خیلی حال بدهند به کار به این شکل میشه
try {
//کدهای شما
}
catch (Exception exception)
{
MessageBox.Show("خطایی رخ داده ");
}


کمترین کاری که میشه برای فهمیدن خطا کرد این است
try {
//کدهای شما
}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
}

خلاصه اینکه از اون آبجکت Exception کلی اطلاعات میشه به دست آورد که کمترینش اینی بود که عرض کردم.


موفق باشید

رامین مرادی
شنبه 06 آبان 1396, 08:14 صبح
میتونید از تراکنش ها هم استفاده کنید تقریبا مثل تابع زیر




public bool Execute(String sql)
{
Connect();
SqlTransaction _SqlTransaction;
_SqlTransaction = cn.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Transaction = _SqlTransaction;
try
{
cmd.Connection = cn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
_SqlTransaction.Commit();
DisConnect();
return true;
}
catch
{
_SqlTransaction.Rollback();
DisConnect();
return false;
}
finally
{
DisConnect();
}
}



در صورت اجرای صحی True و در غیر اینصورت false برگشت داده میشه

m_karimi
شنبه 06 آبان 1396, 08:39 صبح
با تشکر از پاسخ خوبتان. من منظورم این است که وقتی داده به درستی وارد بانک شد و دستور اسکیول به درستی اجرا شد میخواهم پیام موفقیت امیز ثبت در سیستم را بدهم. من دستورات عملیات بانک را در یک کلاس تعریف کردم به صورت زیر
class Operation
{
public static int vall = 0;
public static void open(SqlConnection con)
{
try
{
con.Open();
}
catch
{
MessageBox.Show("در اتصال به پایگاه داده مشکل به وجود آمده است");
}

}

public static void close(SqlConnection con)
{
try
{
con.Close();
}
catch
{
MessageBox.Show("در اتصال به پایگاه داده مشکل به وجود آمده است");
}

}

public static void exe(string cmd_text)
{
SqlConnection con = new SqlConnection();
try
{
con.ConnectionString = KB.connection_string;
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = cmd_text;

cmd.ExecuteNonQuery();
//if (cmd.ExecuteNonQuery() > 0) { vall = 1; }
//MessageBox.Show(cmd.ExecuteNonQuery().ToString());
con.Close();
}
catch (SqlException ex)
{

MessageBox.Show("در اتصال به پایگاه داده مشکل به وجود آمده است");
}
catch (IOException)
{ }
catch (DivideByZeroException)
{ }

catch
{ }
finally
{
con.Close();
}

}


و در خود دکمه ثبت مینویسم
Operation.exe(sq);

MessageBox.Show("ثبت با موفقیت انجام شد");

ولی در هر صورت چه داده ثبت شود چه نشود پیغام موفقیت امیز میدهد

رامین مرادی
شنبه 06 آبان 1396, 09:05 صبح
خب دوست عزیز کدی که من قرار دادم با تراکنش ها هست. در صورت صحیح اجرا شدن دستور و ثبت داده در اس کیو ال نتیجه درست رو برمیگردونه. اما اگه خطایی رخ بده دستور اجرا نمیشه

بجای تابع exec خودتون. تابعی که من قرار دام رو بزارید. ورودیش هم همون دستور اس کیو ال هست که به صورت رشته بهش میدید. فقط یادتون باشه دستور باز کردن و بستن کانکشن رو با مال من جایگزین کنید.