تقييم الموضوع :
  • 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 ، و هذا من الطبيعي انه سيحدث خطأ !!!



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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [VB.NET] اريد كود جلب اخر اسم في قاعدة البيانات عن طريق button4 suliman01 1 562 06-01-24, 02:32 AM
آخر رد: HALIM ELEULMA
  [VB.NET] كود جلب اخر اسم في قاعدة البيانات عن طريق button4 suliman01 2 721 05-01-24, 01:19 AM
آخر رد: HALIM ELEULMA
  [كود] كود[اضافة او حذف الـ PK من الجدول] سعود 0 365 27-05-23, 02:50 AM
آخر رد: سعود
  بعض الاكواد المفيدة في التعامل مع قاعدة بيانات اكسس ابو ليلى 3 9,484 15-10-22, 12:16 AM
آخر رد: kebboud
  كيف يمكن مشاركة وتقسيم قاعدة البيانات اكسس لأكثر من مستخدم للشبكة بالفيجول بيسك Lathe1 1 2,006 14-02-21, 12:22 AM
آخر رد: sendbad100
  كود اضافة نص لنص وحذفه دون تاثر اي النصين سعود 0 1,652 09-05-20, 04:59 AM
آخر رد: سعود
  كود إضافة صورة في قاعدة بيانات أكسيس saffor 6 10,181 26-04-20, 11:08 PM
آخر رد: شوشه
  [كود] طريقة ملئ COMBOBOX بقواعد البيانات الموجودة على السيرفر galas 1 3,578 03-08-19, 08:20 PM
آخر رد: count4love
  [كود] خاص بقواعد البيانات ابو يوسف 6 5,607 02-06-19, 08:32 PM
آخر رد: Abdalazim19
  [VB.NET] تشغيل قاعدة البيانات التي على السيرفر من اي جهاز على الشبكة ahmed saleh 4 6,153 10-03-19, 09:49 AM
آخر رد: معتز حسن

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


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