PDA

View Full Version : استفاده از تراکنش در سی شارپ بصورت تو در تو



narges_j
جمعه 01 شهریور 1392, 14:32 عصر
من از این روش از تراکنش استفاده میکنم.

using (TransactionScope transactionScope = new TransactionScope())
{
//INSERT Data into bank

//Alter files...

transactionScope.Complete();
}


سوال این هست که اگر من دو رویداد متفاوت داشته باشم یا دو فرم متفاوت که تراکنش یکی از انها در صورتی کامیت بشه که تراکنش دیگری کامیت شده باشد باید چیکار کنم.

فرض کنید در فرم اول اطلاعاتی را ذخیره میکنم و در فرم دوم نیز اطلاعات دیگر.اطلاعات فرم اول به شرطی ذخیره میشود که اطلاعات فرم دوم کامل ذخیره شده باشد.یا دو تا رویداد که توی اولی یکسری سطر از جدول حذف میکنیم و در رویداد دیگری کل سطرها را ویرایش میکنم حالا به شرطی سطری حذف شود که اطلاعات به طور کامل ویرایش شوند.
امیدوارم تونسته باشم منظورم برسانم
لطفا راهنمایی کنید

debugger
جمعه 01 شهریور 1392, 14:42 عصر
یک متغیر استاتیک bool تعریف کن که در تمامی فرم ها قابل دسترس باشه موقعی که status تراکنش خود را چک کردی متغیر bool را true یا false کن

if (Transaction.Current.TransactionInformation.Status == TransactionStatus.Committed)
{
اینجا متغیر bool خود را مقدار دهی کن
}

به شرطی عملیات حذف را انجام میدی که متغیر bool شما true شده باشد

narges_j
جمعه 01 شهریور 1392, 14:53 عصر
راه دیگه نیست که بشه با اسم تراکنشها کار کنیم؟

debugger
جمعه 01 شهریور 1392, 14:58 عصر
چرا نمیشه بجای current که نمایانگر تراکنش جاری هست Status تراکنش مورد نظرتو چک کن .

FastCode
جمعه 01 شهریور 1392, 15:32 عصر
اگر فقط یک ذره در حد میلی ثانیه فکر کنید راه حل بهتری به ذهنتون میرسه.
راه درستش اینه که تراکنش رو در یک متغیر نگهداری کنید و در Constructor بدهید به فرم دوم.
متغیر static و چی و فلان و بهمان هم نمیخواد
class form1
{
Transaction trans;
void DoWork()
{
trans = Conn.BeginTransaction();
update....
insert....

}
void ShowForm2()
{
form2 f2 = new form2(trans);
f2.ShowDialog();
}
void FinishWork()
{
trans.Commit();
trans.Dispose();
}
}
class form2
{
Transaction trans;
form2(Transaction Trans)
{
trans = Trans;
}
void DoWork()
{
update....
insert....

}
}

narges_j
جمعه 01 شهریور 1392, 17:26 عصر
من rollback را به صورت کد خودم انجام میدم برای استفاده از transaction باید چطوری این کار انجام بدم؟حتما باید دستور sql بنویسم یا از طریق همین دستورات سی شارپ میشه؟

narges_j
جمعه 01 شهریور 1392, 17:47 عصر
اگر فقط یک ذره در حد میلی ثانیه فکر کنید راه حل بهتری به ذهنتون میرسه.
راه درستش اینه که تراکنش رو در یک متغیر نگهداری کنید و در Constructor بدهید به فرم دوم.
متغیر static و چی و فلان و بهمان هم نمیخواد
class form1
{
Transaction trans;
void DoWork()
{
trans = Conn.BeginTransaction();
update....
insert....

}
void ShowForm2()
{
form2 f2 = new form2(trans);
f2.ShowDialog();
}
void FinishWork()
{
trans.Commit();
trans.Dispose();
}
}
class form2
{
Transaction trans;
form2(Transaction Trans)
{
trans = Trans;
}
void DoWork()
{
update....
insert....

}
}
با این کد یعنی کل عملیات هر دو تا فرم در یک تراکنش انجام میشه؟
من خیلی متوجه نشدم :خجالت:
من بک فرم فاکتور دارم که با سه فرم دیگه بسته به این که کاربر نحوه پرداخت را انتخاب کنه در ارتباط.فرم های چک،فیش،..
تراکنش فرم چک را به فرم فاکتور ارسال کنم.بقیه اش متوجه نشدم؟
من میخوام تا زمانی که مشخصات چک ثبت نشده اطلاعات فاکتور هم ثبت نشه این کار را قبلا با متغییر استاتیک انجام داده بودم ولی میخواستم با تراکنش یاد بگیرم


http://intext.nav-links.com/images/spinner-ani48.gif
http://intext.nav-links.com/images/spinner-ani48.gif

FastCode
جمعه 01 شهریور 1392, 19:14 عصر
با این کد یعنی کل عملیات هر دو تا فرم در یک تراکنش انجام میشه؟
بله.

برای rollback هم از دستور trans.RollBack() استفاده کنید.