الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Transaction Control

مغلق
بدأه زائرة عربية في 5 فبراير 2007 · 4 رد · 848 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم ورحمن الله وبركاته،

انا استخدم c#

اريد تحسن برنامجي ... حاليا، البرنامج يحتوي على الاتي:

functionA يستدعيى functionB و functionC و functionD

functionB يعمل open لقاعده البيانات ويعمل insert ثم يعمل close

functionC يعمل open لقاعده البيانات ويعمل query ثم يعمل close

functionD يعمل open لقاعده البيانات ويعمل update ثم يعمل close

اريد اعاده كتب الكود لسببين اساسيين:

1. لعمل transaction control

2. اريد تنظيف الكود بحيث ان اخفف من كثره تكرار نفس الكود (open لقاعدة البيانات)

فالذي اريده هو ان اجعل functionA يعمل عملية الـopen لقاعدة البيانات، ثم يستدعي functionB لعمل الـinsert ، ثم يستدعي functionC لعمل الـquery ، ثم يستدعي functionD لعمل الـupdate واخيرا يعمل commit لهذه العمليات (وان لم تنجح فيعمل rollback)

كود functionB:

// Connect to a Microsoft Access database using the
// System.Data.OleDb.OleDbConnection class
string strOleDb;
strOleDb = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+myPath;

OleDbConnection cn = new OleDbConnection(strOleDb);
OleDbCommand myCom = new OleDbCommand();
myCom.Connection = cn;
cn.Open();

myCom.CommandText = "Insert Into ...";


myCom.ExecuteNonQuery();

cn.Close();

كود functionC:

// Connect to a Microsoft Access database using the
// System.Data.OleDb.OleDbConnection class
string strOleDb;
strOleDb = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+myPath;
OleDbConnection cnOleDb = new OleDbConnection();
cnOleDb.ConnectionString = strOleDb;

// Create a OleDbDataReader object
OleDbDataReader dr;

// Create a new OleDbCommand object
OleDbCommand cmd = new OleDbCommand();

// Set the Select statement in the CommandText property and
// set the Connection property to the "cn" OleDbConnection object
// just created

cmd.CommandText =@"SELECT ...";

cmd.Connection = cnOleDb;

// Open the Connection
cnOleDb.Open();

// Call the ExecuteReader method of the Command object
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

while (dr.Read())
{
//do stuff
}//end while

// Close the Connection object
cnOleDb.Close();

كود functionD:

// Connect to a Microsoft Access database using the
// System.Data.OleDb.OleDbConnection class
string strOleDb;
strOleDb = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+myPath;

OleDbConnection cn = new OleDbConnection(strOleDb);
OleDbCommand myCom = new OleDbCommand();
myCom.Connection = cn;
cn.Open();

myCom.CommandText = "Update  ...";


myCom.ExecuteNonQuery();

cn.Close();

كيف اعمل هذا الشئ؟

شكرا و -waf

تم تعديل هذه المشاركة بواسطة زائرة عربية في 5 فبراير 2007 في 04:09

#2

اناعندي حل مشابه بس بلغة VB.Net

اللي أعرفه انك ممكن تعمل الInsert مع Update أما ال Select فماني لاقيلها حل

كل اللي تحتاجه انك أولا تجمع كل الCommands في مصفوفة من نوع String

Dim str(2) as String

str(0)="Insert ..."

str(1)="Update...."

بعد كده بتعدل عالكود بتاعك شوية عشان تعمل الترانساكشن :

// Connect to a Microsoft Access database using the
// System.Data.OleDb.OleDbConnection class
string strOleDb;
strOleDb = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+myPath;

OleDbConnection cn = new OleDbConnection(strOleDb);
OleDbCommand myCom = new OleDbCommand();
myCom.Connection = cn;
cn.Open();

'-----------------  

حاول تعدل هذا الكود بلغتك المفضلة

Try

Dim indx as int16

Dim Tran As OleDbTransaction

Tran = cn.BeginTransaction

myCom.Transaction = Tran





Dim Recs As Integer
For Index = 0 To str.GetUpperBound(0)
						myCom.CommandText = str(indx)
						If Len(Trim(myCom.CommandText)) > 0 Then
							Recs = Cmd.ExecuteNonQuery()
						End If

					Next

Tran.Commit()



Catch ex as Exeption

Tran.Rollback()

Finally
If Cn.State = ConnectionState.Open Then
						Cn.Close()
   End If
'------------------

تم تعديل هذه المشاركة بواسطة Scoool في 5 فبراير 2007 في 08:20

#3

بسم الله الرحمن الرحيم

شكرا لك scool على الرد وجزاك الله خير، ولكن للاسف لا استطيع ان اعمل هذا الشئ

لان بين كل function عمليات ودالات اخرى، فمثلا عندك في اول function (اللي هو functionA):

call functionB

do stuff

call functionZ

call functionX

call functionC

call function Y

call functionD

وكما ذكرت، فقط functionB وfunctionC وfunctionD يتعاملو مع الداتابيس

واهم شئ عندي ان ما اعمل commit او close في functionD (او بعد اتمامه) الا لما اتأكد من نجاح العمليات في functionB وfunctionC

إن شاء الله تكونو فهمتو ايش المشكله وإن شاء الله احد يلاقيلي حل

شكرا و

#4

<_<

للأسف .. ماني قادر أفهم بالضبط لانه الوضع مشربك بعض الشي

#5

up

اذا لم تزد شيئا علي الحياة فلا تكن انت زائدا عليها

هذا الموضوع مغلق.

مواضيع مشابهة