19 | Insert multiple rows (all rows) from DataGridView into the database

 هذا الكود يقوم بحفظ قائمة من بيانات الطلاب الموجودة في DataGridView إلى قاعدة بيانات SQL Server، ويشمل التحقق من بعض الشروط لضمان أن العملية تتم بشكل صحيح.

الشرح المفصل لكل جزء من الكود:

١. التحقق من عدد الصفوف في DataGridView:

If dgvTempDB.Rows.Count = 0 Then

   MsgBox("يرجى تحميل جدول اسماء الطلاب قبل الحفظ", vbMsgBoxRight + MsgBoxStyle.Exclamation, "جاري الحفظ ...")

            Return

 End If

  • dgvTempDB.Rows.Count = 0: يتحقق من عدد الصفوف في DataGridView dgvTempDB. إذا كانت عدد الصفوف 0، فهذا يعني أن جدول الطلاب لم يتم تحميله بعد.
  • إذا كانت هذه الشروط صحيحة، تظهر رسالة تحذيرية للمستخدم، ويتم إيقاف تنفيذ الكود باستخدام Return.

٢. التحقق من اختيار الصف في ComboBox:

If cbox_stage.SelectedIndex = 0 Then

   MsgBox("يرجى اختيار الصف قبل الحفظ", vbMsgBoxRight + MsgBoxStyle.Exclamation, "جاري الحفظ ...")

            Return

 End If

  • cbox_stage.SelectedIndex = 0: يتحقق إذا كان المستخدم قد اختار الصف من ComboBox cbox_stage. إذا كانت قيمة الفهرس هي 0، فهذا يعني أنه لم يتم اختيار أي صف.
  • إذا كانت هذه الشروط صحيحة، تظهر رسالة تحذيرية للمستخدم، ويتم إيقاف تنفيذ الكود باستخدام Return.

٣. التأكد من رغبة المستخدم في حفظ البيانات:

If MsgBox("هل ترغب بحفظ قائمة الطلاب الحالية في قاعدة البيانات؟", vbMsgBoxRight + MsgBoxStyle.Question + vbYesNo, Title:="جاري الحفظ ...") = vbYes Then

  • هنا يظهر للمستخدم رسالة تأكيد تطلب منه التحقق من أنه يرغب في حفظ البيانات في قاعدة البيانات.
  • إذا اختار المستخدم نعم (vbYes)، يستمر تنفيذ الكود داخل هذا البلوك.

٤. إنشاء الاتصال بقاعدة البيانات:

Dim con As New SqlConnection(conString)

  • يتم إنشاء SqlConnection مع استخدام conString (سلسلة الاتصال) التي تحتوي على معلومات الاتصال بقاعدة البيانات.

٥. معالجة كل صف في DataGridView:

١. التكرار عبر صفوف DataGridView:

For Each row As DataGridViewRow In dgvTempDB.Rows

    • For Each row As DataGridViewRow In dgvTempDB.Rows: يقوم الكود بالتكرار عبر كل صف في DataGridView dgvTempDB

    • هذه الحلقات تتيح لك التعامل مع كل صف من البيانات في DataGridView على حدة.

    ٢. استخدام SqlCommand لإدخال البيانات:

Using cmd As New SqlCommand("INSERT INTO tbl_st_info (st_name, stage_id, group_id, registration_date,st_dob, academic_year, st_gender, st_ph_no, pa_ph_no, discount, discount_type, study_fee, added_date, added_by,account_status, notes)

      • Using cmd As New SqlCommand(...): داخل Using يتم إنشاء كائن SqlCommand لتنفيذ استعلام INSERT لإدخال البيانات إلى جدول tbl_st_info في قاعدة البيانات.
      • الاستعلام يقوم بإدخال البيانات إلى الأعمدة المذكورة في tbl_st_info باستخدام القيم التي سيتم تحديدها بواسطة Parameters.

    ٣. إضافة القيم من DataGridView إلى استعلام INSERT:

    cmd.Parameters.AddWithValue("@st_name", row.Cells("st_name").Value)

    cmd.Parameters.AddWithValue("@stage_id", cbox_stage_id.Text)

    cmd.Parameters.AddWithValue("@group_id", cbox_group_id.Text)

    cmd.Parameters.AddWithValue("@registration_date",row.Cells("registration_date").Value)

    cmd.Parameters.AddWithValue("@st_dob", row.Cells("st_dob").Value)

    cmd.Parameters.AddWithValue("@academic_year", row.Cells("academic_year").Value)

    cmd.Parameters.AddWithValue("@st_gender", row.Cells("st_gender").Value)

    cmd.Parameters.AddWithValue("@st_ph_no", row.Cells("st_ph_no").Value)

    cmd.Parameters.AddWithValue("@pa_ph_no", row.Cells("pa_ph_no").Value)

    cmd.Parameters.AddWithValue("@discount", row.Cells("discount").Value)

    cmd.Parameters.AddWithValue("@discount_type", row.Cells("discount_type").Value)

    cmd.Parameters.AddWithValue("@study_fee", row.Cells("study_fee").Value)

    cmd.Parameters.AddWithValue("@added_date", Date.Now.ToString("yyyy/MM/dd hh:mm:ss"))

    cmd.Parameters.AddWithValue("@added_by", UserLogin)

    cmd.Parameters.AddWithValue("@account_status", "مفعل")

    cmd.Parameters.AddWithValue("@notes", row.Cells("notes").Value)

    • cmd.Parameters.AddWithValue("@parameter", value): يقوم هذا السطر بإضافة كل قيمة إلى الاستعلام كمعاملات (Parameters) لعملية INSERT. على سبيل المثال:

    • @st_name: يعين قيمة st_name من الخلية المناسبة في الصف row.Cells("st_name").Value.
    • @stage_id: يتم أخذ القيمة من cbox_stage_id.Text (أي النص الذي تم تحديده في ComboBox).
    • @registration_date: يعين قيمة registration_date من الخلية المناسبة في DataGridView.
    • @added_date: يتم تعيين قيمة التاريخ الحالي باستخدام Date.Now.ToString("yyyy/MM/dd hh:mm:ss").
      @added_by: يتم تعيين قيمة UserLogin (أي اسم المستخدم الذي قام بتسجيل الدخول).

    • @account_status: تم تعيينه إلى "مفعل" بشكل ثابت.

    ٤. إعداد خصائص SqlCommand:

    cmd.CommandType = CommandType.Text

    cmd.CommandTimeout = 420

  • cmd.CommandType = CommandType.Text: يعني أن الاستعلام هو نص عادي (SQL) سيتم تنفيذه.
  • cmd.CommandTimeout = 420: تعيين المهلة الزمنية للاستعلام إلى 420 ثانية (أي 7 دقائق).
  •  

    ٥. فتح الاتصال بقاعدة البيانات وتنفيذ الاستعلام:

    con.Open()

    cmd.ExecuteNonQuery()

    con.Close()

        • con.Open(): فتح الاتصال بقاعدة البيانات.
        • cmd.ExecuteNonQuery(): تنفيذ الاستعلام INSERT بدون إرجاع أي نتائج (يتم فقط إدخال البيانات).
        • con.Close(): إغلاق الاتصال بقاعدة البيانات بعد تنفيذ الاستعلام.

      ٦. الإغلاق التلقائي للكائنات باستخدام Using:

        • عند الانتهاء من استخدام cmd داخل Using، يتم إغلاق الكائن تلقائيًا وتحرير الموارد المرتبطة به. هذا يضمن إدارة أفضل للذاكرة.

      ملاحظات:

        • dgvTempDB.Rows: يتم التكرار عبر كل صف في DataGridView dgvTempDB، حيث يتم التعامل مع كل صف بشكل فردي.
        • cmd.Parameters.AddWithValue: يتم استخدام المعاملات لتجنب هجمات SQL Injection وضمان أمان الاستعلامات.
        • connection.Open() و connection.Close(): فتح وإغلاق الاتصال مع قاعدة البيانات لتوفير الموارد وضمان عدم بقاء الاتصال مفتوحًا بعد انتهاء العملية.
        • ExecuteNonQuery: هذه الطريقة تستخدم عندما لا تحتاج إلى إرجاع قيم من الاستعلام (مثل الاستعلامات التي تُحدث أو تُدرج أو تُحذف بيانات).

      ٦. إظهار رسالة تأكيد عند حفظ البيانات:

      MsgBox("تم حفظ قائمة الطلاب بنجاح", vbMsgBoxRight + MsgBoxStyle.Information, "جاري الحفظ...")

      • بعد حفظ جميع البيانات في قاعدة البيانات، يظهر للمستخدم رسالة تأكيد بأن البيانات تم حفظها بنجاح.

      ملاحظات إضافية:

      • Return: تُستخدم لإيقاف تنفيذ الكود عند حدوث خطأ في التحقق الأولي (مثل عدم اختيار الصف أو عدم تحميل الجدول).
      • Using: يُستخدم لإدارة دورة حياة الكائنات مثل SqlCommand، مما يضمن أنه يتم تحرير الموارد بشكل صحيح عند الانتهاء من استخدام الكائن.
      • يتم استخدام Date.Now.ToString("yyyy/MM/dd hh:mm:ss") لتخزين تاريخ ووقت إضافة البيانات، مما يضمن أنه يتم تخزين التاريخ والوقت بشكل صحيح في قاعدة البيانات.


      الخلاصة:

      هذا الكود يقوم بحفظ بيانات الطلاب من DataGridView إلى قاعدة البيانات بعد التأكد من أن جميع الشروط تم تلبيتها (مثل تحميل الجدول واختيار الصف). يتم تنفيذ عملية INSERT لكل صف في الجدول مع تخزين المعلومات المطلوبة في قاعدة البيانات.


      الكود كاملا داخل زر  -  btn_save

      Private Sub btn_save_Click(sender As Object, e As EventArgs) Handles btn_save.Click

              If dgvTempDB.Rows.Count = 0 Then

                  MsgBox("يرجى تحميل جدول اسماء الطلاب قبل الحفظ", vbMsgBoxRight + MsgBoxStyle.Exclamation, "جاري الحفظ ...")

                  Return

              End If

              If cbox_stage.SelectedIndex = 0 Then

                  MsgBox("يرجى اختيار الصف قبل الحفظ", vbMsgBoxRight + MsgBoxStyle.Exclamation, "جاري الحفظ ...")

                  Return

              End If

       

              If MsgBox("هل ترغب بحفظ قائمة الطلاب الحالية في قاعدة البيانات؟", vbMsgBoxRight + MsgBoxStyle.Question + vbYesNo, Title:="جاري الحفظ ...") = vbYes Then

                  Dim con As New SqlConnection(conString)

                  Dim dt As New DataTable

                  dt.Clear()

                  For Each row As DataGridViewRow In dgvTempDB.Rows

                      Using cmd As New SqlCommand("INSERT INTO tbl_st_info (st_name, stage_id, group_id, registration_date,st_dob, academic_year, st_gender, st_ph_no, pa_ph_no, discount, discount_type, study_fee, added_date, added_by,account_status, notes)

                                                 VALUES (@st_name, @stage_id, @group_id, @registration_date,@st_dob, @academic_year, @st_gender, @st_ph_no, @pa_ph_no, @discount, @discount_type, @study_fee, @added_date, @added_by,@account_status, @notes)", con)

      cmd.Parameters.AddWithValue("@st_name", row.Cells("st_name").Value)

      cmd.Parameters.AddWithValue("@stage_id", cbox_stage_id.Text)

      cmd.Parameters.AddWithValue("@group_id", cbox_group_id.Text)

      cmd.Parameters.AddWithValue("@registration_date", row.Cells("registration_date").Value)

      cmd.Parameters.AddWithValue("@st_dob", row.Cells("st_dob").Value)

      cmd.Parameters.AddWithValue("@academic_year", row.Cells("academic_year").Value)

      cmd.Parameters.AddWithValue("@st_gender", row.Cells("st_gender").Value)

      cmd.Parameters.AddWithValue("@st_ph_no", row.Cells("st_ph_no").Value)

      cmd.Parameters.AddWithValue("@pa_ph_no", row.Cells("pa_ph_no").Value)

      cmd.Parameters.AddWithValue("@discount", row.Cells("discount").Value)

      cmd.Parameters.AddWithValue("@discount_type", row.Cells("discount_type").Value)

      cmd.Parameters.AddWithValue("@study_fee", row.Cells("study_fee").Value)

      cmd.Parameters.AddWithValue("@added_date", Date.Now.ToString("yyyy/MM/dd hh:mm:ss"))

      cmd.Parameters.AddWithValue("@added_by", UserLogin)

      cmd.Parameters.AddWithValue("@account_status", "مفعل")

      cmd.Parameters.AddWithValue("@notes", row.Cells("notes").Value)

       

                          cmd.CommandType = CommandType.Text

                          cmd.CommandTimeout = 420

                          con.Open()

                          cmd.ExecuteNonQuery()

                          con.Close()


                      End Using

                  Next

                  MsgBox("تم حفظ قائمة الطلاب بنجاح", vbMsgBoxRight + MsgBoxStyle.Information, "جاري الحفظ...")

              End If

       

          End Sub

      إذا كان لديك أي أسئلة أخرى أو تحتاج إلى مزيد من التوضيح، فلا تتردد في طرحها!

      يمكنكم متابعة الدرس عن طريق اليوتيوب





















      تعليقات

      المشاركات الشائعة من هذه المدونة

      7 | Display column's stages from the database into ComboBox's Stage - VB.NET & SQL Server

      26 | Filter Students List based on students' stage and Group in DataGridView - VB.NET & SQL Server

      8 | Get selected Stage and Group IDs from their ComboBoxes - VB.NET & SQL Server