منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : كيف أستخدم TRansaction حتى أضمن تطبيق الكود بشكل جيد
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم إخواني

أرجوا منكم قراءة هذ االكود فقد قمت بترتيبه حتى أسهل مساعدتكم لي

أقوم بترحيل قاعدة بيانات محلية إللى قاعدة أخرى بعيدة   (سطر بسطر)

كيف أستخدم TRansaction حتى أضمن تطبيق الكود بشكل جيد


ملاحظة : Transaction شغالة جيدا عندما تكون العملية على نفس القاعدة 
ملاحظة : قمت بوضع INSERT و UPDATE بذلك الشكل فقط لأوضح الفكرة 







جزاكم الله كل خير على مد يد المساعدة
السلام عليكم ورحمة الله وبركاته
اخي الكريم Sniper 
انت لم تذكر كيف تقوم بحفظ السجلات هل تأخذها من الداتا غرايد ام من الداتا تابل ؟ وهل في كل مرة تقوم بنقل سجل واحد ام كل السجلات دفعة واحدة
شكرا أخي إبراهيم على الرد

البرنامج هو برنامج بيع لأحد المتاجر
كل ساعة هناك بيانات جديدة
فبالتالي وضعت الكود في TIMER و أقوم بنقل سجل واحد كل ثانية (يمكنني تطوير الفكرة في وقت لاحق)
آخد السجلات من الداتا غرايد اللتي تم تعبئتها من الداتا تابل
على العموم اخي sniper
اليك هذين الرابطين اجزى الله اصحابها كل الخير
https://www.youtube.com/watch?v=br8DkBklahE&t=735s

https://www.youtube.com/watch?v=eE6dPpK6O68&t=2141s
من ناحيتي ساضع لك كود حفظ استخدمته في حفظ راس الفاتورة وتفاصيل الفاتورة  حيث يتم الحفظ (عبر اللوب) من الداتاغرايد فيو فاما ان يتم الحفظ في الجدولين او لايحفظ في حال حدوث خطأ اتمنى ان يفيدك
دمت بخير ياغالي


كود :
Private Sub Btn_Save_Click(sender As Object, e As EventArgs) Handles Btn_Save.Click

       Dim trans As SqlTransaction = Cn.BeginTransaction
       Cmd = New SqlCommand
       Cmd.Connection = Cn
       Cmd.Transaction = trans
       Cn.Open()
       Try
           Cmd.CommandText = "insert into BuyMaster(Buy_Id,Buy_Code,Buy_Date,Imp_Name,Total_Buy) Values(@Buy_Id,@Buy_Code,@Buy_Date,@Imp_Name,@Total_Buy)"
           Cmd.Parameters.Add(New SqlParameter("@Buy_Id", SqlDbType.Int)).Value = Txt_Buy_id.Text
           Cmd.Parameters.Add(New SqlParameter("@Buy_Code", SqlDbType.NVarChar)).Value = Txt_Buy_Code.Text
           Cmd.Parameters.Add(New SqlParameter("@Buy_Date", SqlDbType.Date)).Value = CDate(Dtp_Buy_Date.Value.ToString("dd-MM-yyyy"))
           Cmd.Parameters.Add(New SqlParameter("@Imp_Name", SqlDbType.NVarChar)).Value = Cmb_Imp_Name.Text
           Cmd.Parameters.Add(New SqlParameter("@Total_Buy", SqlDbType.Decimal)).Value = Lbl_TotalBill.Text
           Cmd.ExecuteNonQuery()
           Cmd.Parameters.Clear()

           For i As Integer = 0 To Dgv_BuyBill.Rows.Count - 1
               Cmd.CommandText = "insert into BuyDetail(Buy_Bill_Code,Itm_Code,itm_Name,Itm_Price,Quantity,Amount,State) Values(@Buy_Bill_Code,@Itm_Code,@itm_Name,@Itm_Price,@Quantity,@Amount,@State)"

               Cmd.Parameters.Clear() ' هذا السطر مهم جدا لانه يفرغ الباراميترات في كل لفة من لوب مما يمنع تكرار القيم

               Cmd.Parameters.Add(New SqlParameter("@Buy_Bill_Code", SqlDbType.NVarChar)).Value = Dgv_BuyBill.Rows(i).Cells("Buy_Bill_Code").Value
               Cmd.Parameters.Add(New SqlParameter("@Itm_Code", SqlDbType.NVarChar)).Value = Dgv_BuyBill.Rows(i).Cells("Itm_Code").Value
               Cmd.Parameters.Add(New SqlParameter("@itm_Name", SqlDbType.NVarChar)).Value = Dgv_BuyBill.Rows(i).Cells("itm_Name").Value
               Cmd.Parameters.Add(New SqlParameter("@Itm_Price", SqlDbType.Decimal)).Value = CDbl(Dgv_BuyBill.Rows(i).Cells("Price").Value.ToString())
               Cmd.Parameters.Add(New SqlParameter("@Quantity", SqlDbType.Int)).Value = Dgv_BuyBill.Rows(i).Cells("Quantity").Value
               Cmd.Parameters.Add(New SqlParameter("@Amount", SqlDbType.Decimal)).Value = CDbl(Dgv_BuyBill.Rows(i).Cells("Amount").Value.ToString())
               Cmd.Parameters.Add(New SqlParameter("@State", SqlDbType.Bit)).Value = True
               Cmd.ExecuteNonQuery()
           Next
           trans.Commit()
           MessageBox.Show("تم حفظ البيانات بنجاح", "حفظ", MessageBoxButtons.OK, MessageBoxIcon.Information)

       Catch ex As Exception
           trans.Rollback()

           MessageBox.Show(ex.Message)
           'MessageBox.Show("خطأ في البيانات المدخلة لم يتم الحفظ ", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
       Finally
           If Cn.State = ConnectionState.Open Then Cn.Close()
       End Try
       Cn.Close()
   End Sub
شكرا شكرا شكرا أخي ابراهيم على الرابطين و على الكود الذي إستخدمته أنت سيجعلني أصحح أخطائي
جزاك الله من فضله على مساعدتك

فقط مشكلتي في الكود هو إستخدام Transaction مع إثنان من قواعد البيانات واحدة محلية و الثانية بعيدة
Transaction بالطريقة العادية لا يستطيع عمل ذلك
وجدت في مواقع أجنبية إستخدام TransactionScope فقط لم أفهم الطريقة جيدا ب C#
اخي البرمجة بحر وما اوتيت منه الا نقطة 
لم استخدم حفظ بيانات في قاعدة محلية واخرى بعيدة بل لم استخدم الى الان سوى المحلية كوني لم انجز برامج بعد 
اشكرك على TransactionScope ساقرا عنها ان شاء الله 
ابراهيم والله إستفدنا منك كثيرا
شكرا لك على مجهودك