PDA

View Full Version : سوال: استفاده از Commit و RollBack برای ایجاد تغییرات به صورت گروهی در دیتابیس



اسماعیل ابراهیمی
یک شنبه 02 بهمن 1390, 17:50 عصر
با سلام به دوستان

بنده در برنامه ام حالت هایی دارم که باید روی چند جدول عملیاتی انجام بشه .

مثلاً می خوام در جدول فروش ذخیره اطلاعات ، در جدول مشتری تغییر یک رکورد و در جدول محصولات هم تغییر در یک رکورد رو انجام بدم ...

ممکنه حالتی پیش بیاد که وسط کار مثلا برق بره یا سیستم هنگ کنه یا هر دلیل دیگه ای ...

نمی خوام در برنامه ام عدم هماهنگی داشته باشم ...

بنابراین باید از Commit و RollBack قبل و بعد از دستوراتم انجام بدم ....

بنده برای هر جدول یک کلاس تعریف کردم که داخلش متد های درج ، حذف و ویرایش وجود داره

حالا می خوام این کارو بکنم :

مثلا :

اجرای متد ذخیره از کلاس 1
اجرای متد ویرایش از کلاس 2
اجرای متد حذف از کلاس 3

اگر این 3 فراخوانی رو داخل دستورات Commit یا RollBack بزارم درسته یا نه ؟

لطفاٌ اگر کسی نمونه ای داره بزاره یا راهنمایی کامل بکنه

با تشکر فراوان

meysamrt
یک شنبه 02 بهمن 1390, 22:16 عصر
یک کلاس رو به عنوان کلاس اصلی در نظر بگیر و متد درج دیگری به آن اضافه کن. مثلا من 3 تا کلاس دارم که باید درج یا هر متد دیگری از هرسه کلاس با هم اجرا شوند. بعد از اینکه سومین کلاس کارش تمام شد اطلاعات بصورت واقعی در بانک اطلاعاتی قرار بگیرند.



class DataAccess
{
public static SqlCommand CreateCommand()
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "ConnectionString";
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandType = CommandType.StoredProcedure;
return comm;
}

public static int ExecuteNonQuery(SqlCommand comm)
{
int result = 0;
try
{
if (comm.Connection.State != ConnectionState.Open)
comm.Connection.Open();
if (comm.Transaction == null)
comm.Transaction = comm.Connection.BeginTransaction();
result = comm.ExecuteNonQuery();
}
catch (Exception ex)
{
if (comm.Transaction != null)
comm.Transaction.Rollback();
throw ex;
}
return result;
}
}
class A
{
public void insert(parameters, SqlCommand comm)
{
bool trans=true;
try
{
if(comm==null)
{
trans=false;
comm=DataAccess.CreateCommand();
}
...
<insert statement>
DataAccess.ExecuteNonQuery(comm);
...
if(!trans)
comm.Transaction.Commit();
}
catch
{
if (comm.Transaction!=null)
comm.Transaction.RollBack();
}
}

public static void AllInsert(A objA, B objB, C objC)
{
try
{
SqlCommand comm=DataAccess.CreateCommand();
objA.Insert(parameters,comm);
objB.Insert(parameters,comm);
objC.Insert(parameters,comm);
comm.Transaction.Commit();
}
catch
{
if (comm.Transaction!=null)
comm.Transaction.RollBack();
}
}
}

class B
{
public void insert(parameters, SqlCommand comm)
{
bool trans=true;
try
{
if(comm==null)
{
trans=false;
comm=DataAccess.CreateCommand();
}
...
<insert statement>
DataAccess.ExecuteNonQuery(comm);
...
if(!trans)
comm.Transaction.Commit();
}
catch
{
if (comm.Transaction!=null)
comm.Transaction.RollBack();
}
}
}

class C
{
public void insert(parameters, SqlCommand comm)
{
bool trans=true;
try
{
if(comm==null)
{
trans=false;
comm=DataAccess.CreateCommand();
}
...
<insert statement>
DataAccess.ExecuteNonQuery(comm);
...
if(!trans)
comm.Transaction.Commit();
}
catch
{
if (comm.Transaction!=null)
comm.Transaction.RollBack();
}
}
}