PDA

View Full Version : سوال: ایجاد تراکنش برای تابعی که دستورات sql رو اجرا میکنه



رامین مرادی
دوشنبه 26 تیر 1396, 12:04 عصر
وقت بخیر
من برا راحتی کارام و جلوگیری از تکرار کد اومدم برای دستورات درج و ویرایش و حذف یک تابع نوشتم.
تو اون تابع دستور رو به صورت رشته ای که تو لایه های قبلی ایجاد شده رو دریافت میکنم و اجرا میگیرم ازش.

کد تابع هم به این صورته

public void Run(String sql)
{
SqlCommand cmd = new SqlCommand();
Connect();//اتصال به دیتا بیس
cmd.Connection = cn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
DisConnect(); //قطع اتصال دیتا بیس
}


خب حالا میخوام بدونم میشه برای این تابع تراکنش ایجاد کرد. تا به هر دلیلی خطایی رخ داد تراکنش مانع از اعمال تغییرات بشه و رول بک انجام بشه(البته تو برنامه سعی کردم خطا ها رو کنترل کنم )

Mahmoud.Afrad
دوشنبه 26 تیر 1396, 16:30 عصر
https://msdn.microsoft.com/en-us/library/86773566(v=vs.110).aspx#Anchor_3

رامین مرادی
سه شنبه 27 تیر 1396, 09:13 صبح
https://msdn.microsoft.com/en-us/library/86773566(v=vs.110).aspx#Anchor_3

transaction = connection.BeginTransaction("SampleTransaction");
ممنون میشم این خط رو توضیح بدید.

Mahmoud.Afrad
سه شنبه 27 تیر 1396, 21:54 عصر
صرفا یک نام هست که میوته هر چیزی باشه یا بدون نام
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.begintransacti on.aspx

رامین مرادی
چهارشنبه 28 تیر 1396, 10:59 صبح
صرفا یک نام هست که میوته هر چیزی باشه یا بدون نام
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.begintransacti on.aspx

من تابع ام رو به صورت زیر تغییر دادم. به نظرتون خوبه یا میشه بهتر از این هم نوشت؟؟!!:متفکر:


public void 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();
}
catch
{
_SqlTransaction.Rollback();
}
finally
{
DisConnect();
}
}

Mahmoud.Afrad
چهارشنبه 28 تیر 1396, 11:32 صبح
متد ExecuteNonQuery مقداری را بازگشت میده که میشه قهمید چند رکورد تحت تاثیر کوئری قرار گرفته‌اند؛ که معمولا این مقدار را return می‌کنند.
لینک‌های زیر نمونه‌های خوبی از لایه دسترسی به داده (Data Access Layer) رو پیاده سازی کرده‌اند که می‌تونید ازشون کمک بگیرید
http://aspalliance.com/837_implementing_a_data_access_layer_in_c
https://msdn.microsoft.com/en-us/library/ms971568.aspx
لینک زیر هم شبیه لینک‌های بالاست منتها به صورت شئ‌گرا داده‌ها را تحویل لایه بعد میده
http://www.c-sharpcorner.com/article/an-elegant-C-Sharp-data-access-layer-using-the-template-pattern-a