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
: يتحقق من عدد الصفوف فيDataGridView
dgvTempDB
. إذا كانت عدد الصفوف 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
: يتحقق إذا كان المستخدم قد اختار الصف من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
: يقوم الكود بالتكرار عبر كل صف في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("@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
: يتم التكرار عبر كل صف فيDataGridView
dgvTempDB
، حيث يتم التعامل مع كل صف بشكل فردي.
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
إذا كان لديك أي أسئلة أخرى أو تحتاج إلى مزيد من التوضيح، فلا تتردد في طرحها!
تعليقات
إرسال تعليق