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
If dgvTempDB.Rows.Count = 0 Then
MsgBox("يرجى تحميل جدول اسماء الطلاب قبل الحفظ",
vbMsgBoxRight + MsgBoxStyle.Exclamation, "جاري الحفظ ...")
Return
End If
dgvTempDB.Rows.Count = 0: يتحقق من عدد الصفوف فيDataGridViewdgvTempDB. إذا كانت عدد الصفوف 0، فهذا يعني أن جدول الطلاب لم يتم تحميله بعد.
- إذا كانت هذه الشروط صحيحة، تظهر رسالة تحذيرية للمستخدم، ويتم إيقاف تنفيذ الكود باستخدام
Return.
٢. التحقق من اختيار الصف في ComboBox:
If cbox_stage.SelectedIndex = 0
Then
MsgBox("يرجى اختيار الصف قبل الحفظ",
vbMsgBoxRight + MsgBoxStyle.Exclamation, "جاري الحفظ ...")
Return
End If
If cbox_stage.SelectedIndex = 0
Then
MsgBox("يرجى اختيار الصف قبل الحفظ",
vbMsgBoxRight + MsgBoxStyle.Exclamation, "جاري الحفظ ...")
Return
End If
cbox_stage.SelectedIndex = 0: يتحقق إذا كان المستخدم قد اختار الصف منComboBoxcbox_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: يقوم الكود بالتكرار عبر كل صف فيDataGridViewdgvTempDB.
- هذه الحلقات تتيح لك التعامل مع كل صف من البيانات في
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("@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: تم تعيينه إلى "مفعل" بشكل ثابت.
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
cmd.CommandTimeout = 420
cmd.CommandType = CommandType.Text: يعني أن الاستعلام هو نص عادي (SQL) سيتم تنفيذه.cmd.CommandTimeout = 420: تعيين المهلة الزمنية للاستعلام إلى 420 ثانية (أي 7 دقائق).
٥. فتح الاتصال بقاعدة البيانات وتنفيذ الاستعلام:
con.Open()
cmd.ExecuteNonQuery()
con.Close()
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: هذه الطريقة تستخدم عندما لا تحتاج إلى إرجاع قيم من الاستعلام (مثل الاستعلامات التي تُحدث أو تُدرج أو تُحذف بيانات).
dgvTempDB.Rows: يتم التكرار عبر كل صف فيDataGridViewdgvTempDB، حيث يتم التعامل مع كل صف بشكل فردي.
cmd.Parameters.AddWithValue: يتم استخدام المعاملات لتجنب هجمات SQL Injection وضمان أمان الاستعلامات.
connection.Open()وconnection.Close(): فتح وإغلاق الاتصال مع قاعدة البيانات لتوفير الموارد وضمان عدم بقاء الاتصال مفتوحًا بعد انتهاء العملية.
ExecuteNonQuery: هذه الطريقة تستخدم عندما لا تحتاج إلى إرجاع قيم من الاستعلام (مثل الاستعلامات التي تُحدث أو تُدرج أو تُحذف بيانات).
٦. إظهار رسالة تأكيد عند حفظ البيانات:
MsgBox("تم حفظ قائمة الطلاب بنجاح",
vbMsgBoxRight + MsgBoxStyle.Information, "جاري الحفظ...")
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
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
إذا كان لديك أي أسئلة أخرى أو تحتاج إلى مزيد من التوضيح، فلا تتردد في طرحها!

تعليقات
إرسال تعليق