02-11-16, 01:48 AM
السلام عليكم و رحمة الله و بركاته ،،
اليوم احببت ان اضع كود بسيط لا يعرفه الكثير من الزملاء وهو التراجع عن عملية في قاعدة البيانات . ولعلك تتسأل ما الغرض او الفائده منها .
لنفرض مثلاً بانك تقوم باضافة بيانات في احد الجداول و تريد اضافة بيانات أخرى الى جدول اخر مرتبطه بالبيانات التي في الجدول الاول و لكن لسبب ما حصل خطأ غير متوقع مما سيجبرك الى حذف البيانات السابقه لانه حصل خطأ .
السيناريو المعتاد هو انك ستقوم بحذف الحقل التي تم اضافته بجملة استعلام جديده هذا اذا كان الحقل الذي تم التأثير عليه محدود فما بالك اذا كان خطأ قاتل اما تحديث جميع البيانات او او او ...الخ الحالات كثيره و لا يمكنني حصرها ، وهنا يأتي دور المكتبه Transaction.Rollback() و التي ستقوم بهذا الدور نيابه عنك ، بحيث تتراجع عن جميع الكويري التي طبقتها اذا حصل خطأ ما و بهذا تختصر عليك كتابة أكواد لمعالجة الخطأ الذي حصل .
كود يشرح طريقة استخدامها :
هذا الكود سيقوم باضافة بيانات بشكل سليم و لا يوجد فيه اي خطأ لذلك سيتم التنفيذ بدون اي مشاكل و لكن لنقوم بالتلاعب في جملة الاستعلام الثانيه ، وهي :
و نقوم بكتابة العمود RegionID بهذا الشكل RegionD بدون حرف الـ I ، و هذا من الطبيعي انه سيحدث خطأ !!!
و لكن ماذا سيحدث ؟! لن يتم تطبيق جملة الاضافه الاولى بالرغم انه تم تنفيذها بنجاح و بدون مشاكل و لكن ربطنا نجاح جميع الكويري تعتمد على عدم فشل اي واحده منهن ، و في حالة خلاف ذلك فانه لن يتم تنفيذ الكل حتى لو كانت صحيحه ، اتمنى ان الفكره اتضحت الان .
اليوم احببت ان اضع كود بسيط لا يعرفه الكثير من الزملاء وهو التراجع عن عملية في قاعدة البيانات . ولعلك تتسأل ما الغرض او الفائده منها .
لنفرض مثلاً بانك تقوم باضافة بيانات في احد الجداول و تريد اضافة بيانات أخرى الى جدول اخر مرتبطه بالبيانات التي في الجدول الاول و لكن لسبب ما حصل خطأ غير متوقع مما سيجبرك الى حذف البيانات السابقه لانه حصل خطأ .
السيناريو المعتاد هو انك ستقوم بحذف الحقل التي تم اضافته بجملة استعلام جديده هذا اذا كان الحقل الذي تم التأثير عليه محدود فما بالك اذا كان خطأ قاتل اما تحديث جميع البيانات او او او ...الخ الحالات كثيره و لا يمكنني حصرها ، وهنا يأتي دور المكتبه Transaction.Rollback() و التي ستقوم بهذا الدور نيابه عنك ، بحيث تتراجع عن جميع الكويري التي طبقتها اذا حصل خطأ ما و بهذا تختصر عليك كتابة أكواد لمعالجة الخطأ الذي حصل .
كود يشرح طريقة استخدامها :
كود :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim conStr As String = "Data Source=.\MYSSQLSERVER;Initial Catalog=TestMYS;Trusted_Connection=Yes;"
Call Me.RunSqlTransaction(conStr)
End Sub
Public Sub RunSqlTransaction(ByVal myConnString As String)
Dim myConnection As New SqlConnection(myConnString)
myConnection.Open()
Dim myCommand As SqlCommand = myConnection.CreateCommand()
Dim myTrans As SqlTransaction
' Start a local transaction
myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted, "SampleTransaction") ' بدأ عملية تسجيل الكويري المطبقه على قاعدة البيانات
' Must assign both transaction object and connection
' to Command object for a pending local transaction
myCommand.Connection = myConnection
myCommand.Transaction = myTrans
Try
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description'); SELECT SCOPE_IDENTITY() ;"
Dim RecordId As Integer = myCommand.ExecuteScalar()
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"
myCommand.ExecuteNonQuery()
myTrans.Commit() ' عندما يتم ارسال هذا الامر يعني بانه اعتمد التغيرات على قاعدة البيانات و لا تستطيع التراجع عن الامر
Console.WriteLine("Both records are written to database.")
Catch e As Exception
Try
myTrans.Rollback("SampleTransaction") ' مثلا لو حصل في الاستعلام الثانيه خطأ مثل اسم العمود خطأ أو أو ...الخ فانه يأمر بالتراجع عن الكويري الاولى بالرغم انه تم تنفيذها بنجاح
Catch ex As SqlException
If Not myTrans.Connection Is Nothing Then
Console.WriteLine("An exception of type " & ex.GetType().ToString() & _
" was encountered while attempting to roll back the transaction.")
End If
End Try
Console.WriteLine("An exception of type " & e.GetType().ToString() & _
"was encountered while inserting the data.")
Console.WriteLine("Neither record was written to database.")
Finally
myConnection.Close()
End Try
End Sub 'RunSqlTransaction
هذا الكود سيقوم باضافة بيانات بشكل سليم و لا يوجد فيه اي خطأ لذلك سيتم التنفيذ بدون اي مشاكل و لكن لنقوم بالتلاعب في جملة الاستعلام الثانيه ، وهي :
كود :
[size=small][font=Monaco, Consolas, Courier, monospace]myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"[/font][/size]
و نقوم بكتابة العمود RegionID بهذا الشكل RegionD بدون حرف الـ I ، و هذا من الطبيعي انه سيحدث خطأ !!!
و لكن ماذا سيحدث ؟! لن يتم تطبيق جملة الاضافه الاولى بالرغم انه تم تنفيذها بنجاح و بدون مشاكل و لكن ربطنا نجاح جميع الكويري تعتمد على عدم فشل اي واحده منهن ، و في حالة خلاف ذلك فانه لن يتم تنفيذ الكل حتى لو كانت صحيحه ، اتمنى ان الفكره اتضحت الان .
اسم معرفي : محمد يحيى