تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[كود] كيف اتراجع عن عملية اضافة الى قاعدة البيانات عند حدوث خطأ ما
#1
السلام عليكم و رحمة الله و بركاته  ،، 


اليوم احببت ان اضع كود بسيط لا يعرفه الكثير من الزملاء وهو  التراجع  عن عملية في قاعدة البيانات  . ولعلك تتسأل ما الغرض او الفائده  منها .

لنفرض مثلاً بانك تقوم باضافة بيانات  في احد الجداول و تريد اضافة بيانات أخرى الى جدول اخر مرتبطه بالبيانات التي في الجدول الاول و لكن لسبب ما حصل خطأ  غير متوقع  مما سيجبرك الى حذف البيانات  السابقه  لانه حصل خطأ . 

السيناريو المعتاد   Undecided هو انك ستقوم بحذف الحقل التي تم اضافته  بجملة استعلام  جديده  هذا اذا كان الحقل الذي تم التأثير عليه محدود فما بالك اذا  كان خطأ قاتل اما تحديث جميع البيانات  او  او  او  ...الخ الحالات كثيره و لا يمكنني حصرها ، وهنا  يأتي دور  المكتبه    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 ، و هذا من الطبيعي انه سيحدث خطأ !!!



 و لكن ماذا سيحدث ؟! لن يتم  تطبيق جملة الاضافه الاولى  بالرغم انه تم تنفيذها بنجاح و بدون مشاكل و لكن ربطنا نجاح جميع الكويري  تعتمد على عدم فشل اي واحده منهن  ، و في  حالة خلاف ذلك فانه لن يتم تنفيذ الكل حتى لو كانت صحيحه ،  اتمنى ان الفكره اتضحت الان  . 
اسم معرفي : محمد يحيى
الرد }}}}
تم الشكر بواسطة: أبوبكر سويدان , أبوبكر سويدان


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [كود] خاص بقواعد البيانات ابو يوسف 2 583 21-10-16, 05:52 PM
آخر رد: محمد عبد الحكيم محمد
  كود اضافة space في اي نص ahmad abdullah 0 102 04-10-16, 11:55 AM
آخر رد: ahmad abdullah
  تحدي في ربط الفيجوال استوديو 2012 مع قاعدة بيانات اكسيس bassamreg 2 310 07-07-16, 12:47 AM
آخر رد: أبوبكر سويدان
Sad [سؤال] مستخدمين البرنامج و قاعدة البيانات ! GeneralEG 5 368 01-07-16, 07:15 AM
آخر رد: GeneralEG
  [كود] هذا كود للكمبو بوكس يقوم بعرض البيانات داخل التيكست بوكس حسب الرقم احمد عبد الحكيم 4 1,194 30-06-16, 07:17 PM
آخر رد: aliday03
  [كود] ملف txt تحميله الي قاعدة البيانات dubai.eig 1 309 29-05-16, 12:04 AM
آخر رد: CLARO
  [VB.NET] تشغيل قاعدة البيانات التي على السيرفر من اي جهاز على الشبكة ahmed saleh 3 1,112 29-05-16, 12:03 AM
آخر رد: CLARO
  كود إضافة صورة في قاعدة بيانات أكسيس saffor 5 1,115 20-11-15, 10:02 PM
آخر رد: HASAN6.0
  شجرة عرض البيانات من عدة جداول أبو عمر 0 813 13-09-15, 06:28 PM
آخر رد: أبو عمر

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم