تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
درس بسيط لعملية الإضافة والتعديل والبحث والحذف - Visual Basic.net 10 وMS Access
#1
السلام عليكم ورحمة الله

أقدم لكم درساً بسيطاً للتعامل مع قواعد البيانات MS Access من خلال تطبيق بـVisual Basic.

في البداية نغير اسم الـForm الافتراضي للمشروع الجديد إلى frmMain، ونضع عليه:

Text Box: ونسمّه txtSearch
4 Buttons: ونسميهم: btnNew جديد، وbtnEdit تعديل، وbtnDelete حذف، وbtnClose إغلاق.
DataGridView: وسمّه dgvList.

قم بإنشاء قاعدة بيانات نوع mdb باسم saveDate.mdb
وخزنها في المجدل Debug

والآن:

قم بإضافة Module للمشروع باسم: functions
واكتب داخله الكود التالي:
كود :
Imports System.Data.OleDb

Module functions
    Public Con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\saveDate.mdb")
End Module

وهنا قمنا باستدعاء الفضاء System.Data.OleDb الخاص بالتعامل مع قواعد البيانات من النوع MS Access.

في برمجة حدث التحميل للـForm اكتب الكود التالي:
كود :
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' تجهيز الداتاقريدفيو
        With dgvList
            .DataSource = Nothing
            .Rows.Clear()
            .ColumnCount = 3

            .Columns(0).HeaderText = "ID"
            .Columns(0).Width = 30
            .Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

            .Columns(1).HeaderText = "الاســـــــم"
            .Columns(1).Width = 150
            .Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

            .Columns(2).HeaderText = "تاريخ الميلاد"
            .Columns(2).Width = 110
            .Columns(2).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            ' لجعل الخلية تعرض التاريخ فقط
            .Columns(2).DefaultCellStyle.Format = "d"
        End With
        LoadData()
    End Sub


وهذا الكود خاص بتجهيز الـDataGridView برمجياً، ومن ثم تعبئتها من قاعدة البيانات من خلال استدعاء الروتين LoadData ، وفيما يلي برمجته:

كود :
Public Sub LoadData()
        Dim LSQL As String = "select * from TheTable order by ID"
        Dim LAdapter As New OleDbDataAdapter(LSQL, Con)
        Dim LDataSet As New DataSet
        Dim RowsCount As Integer
        Dim i As Integer

        ' مسح الداتاقريدفيو من قيم سابقة محتملة
        dgvList.Rows.Clear()

        If Con.State = ConnectionState.Closed Then
            Con.Open()
            LAdapter.Fill(LDataSet, "LoadingData")
            RowsCount = LDataSet.Tables("LoadingData").Rows.Count
            If RowsCount = 0 Then
                dgvList.Rows.Clear()
                LDataSet.Reset()
                Con.Close()
                Exit Sub
            Else
                dgvList.Rows.Add(RowsCount)

                ' Now: fill DGV with data
                For i = 0 To RowsCount - 1
                    With dgvList
                        .Rows(i).Cells(0).Value = LDataSet.Tables("LoadingData").Rows(i).Item("ID")
                        .Rows(i).Cells(1).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheName")
                        .Rows(i).Cells(2).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheBirthDate")
                    End With
                Next
                LDataSet.Reset()
                Con.Close()
            End If
        Else
            LAdapter.Fill(LDataSet, "LoadingData")
            RowsCount = LDataSet.Tables("LoadingData").Rows.Count
            If RowsCount = 0 Then
                dgvList.Rows.Clear()
                LDataSet.Reset()
                Con.Close()
                Exit Sub
            Else
                dgvList.Rows.Add(RowsCount)

                ' Now: fill DGV with data
                For i = 0 To RowsCount - 1
                    With dgvList
                        .Rows(i).Cells(0).Value = LDataSet.Tables("LoadingData").Rows(i).Item("ID")
                        .Rows(i).Cells(1).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheName")
                        .Rows(i).Cells(2).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheBirthDate")
                    End With
                Next
                LDataSet.Reset()
                Con.Close()
            End If
        End If
    End Sub

وكما نلاحظ، فهذا الروتين Public (عام) يمكن استدعاؤه حتى من خارج هذا الـform، وخاصة عند إجراء العمليات على قاعدة البيانات، بحيث يتم تحديث محتويات الـDtataGridView فور إنهاء العملية.


قم بكتابة الكود التالي في برمجة زر الإغلاق:

كود :
Me.Close
الرد }}}
تم الشكر بواسطة: Amir_Alzubidy , الوادي , سعود , سعود , princelovelorn , 3booody
#2
قمت سلفاً بإنشاء قاعدة بيانات باسم: saveDate.mdb، وبها جدول واحد باسم: TheTable به الحقول التالية:
ID: حقل تلقائي صحيح يمثل رقم السجل.
TheName: حقل نصي، يمثل الاسم.
TheBirthDate: حقل تاريخ، من النوع Short Date، ويمثل تاريخ الميلاد.

والآن، ننشيء Form جديد باسم frmNew، ونضع عليه:
TextBox: ونسمّه txtName
DateTimePicker: ونسمه dtDate
2 Buttons: الأول باسم btnSave حفظ، والثاني btnClose إغلاق.


نرجع إلى الـfrmMain، ونكتب في حدث النقر للزر جديد ما يلي:
كود :
Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNew.Click
        frmNew.ShowDialog()
    End Sub

ووظيفته هي استدعاء الـfrmNew وعرضه أمام المستخدم.



في شاشة تحرير الكود للـfrmNew، نكتب الكود التالي كأول سطر:

كود :
Imports System.Data.OleDb



في حدث التحميل للـForm اكتب:
كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' تجهيز العنصر الخاص بعرض التاريخ
        dtDate.Format = DateTimePickerFormat.Custom
        dtDate.CustomFormat = "yyyy-MM-dd"
    End Sub


وفائدة هذا الكود هي تجهيز الـDateTimePicker بحيث يظهر كما نريد.


نرجع ونكتب في حدث النقر للزر حفظ ما يلي:
كود :
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        If txtName.Text = Nothing Then
            MsgBox("يجب إدخال الاسم", MsgBoxStyle.Critical, "عذراً")
            txtName.Focus()
        Else
            SaveData()
            MsgBox("تم تخزين البيانات بنجاح", MsgBoxStyle.Information, "ألف مبروك")
            txtName.Text = Nothing
            txtName.Focus()
        End If
    End Sub

وفائدة هذا الكود هي التحقق من أن المستخدم كتب فعلاً في صندوق النصوص.

وفي حالة نجاح الشرط يتم تنفيذ روتين الحفظ، وبرمجته كم يلي:
كود :
Private Sub SaveData()
        Dim SaveDataSQl As String = "INSERT INTO TheTable (TheName,TheBirthDate) VALUES(@TheName,@TheBirthDate)"
        Dim SaveDataCMD As New OleDbCommand

        If Con.State = ConnectionState.Closed Then
            ' إذا كان الاتصال مقفل
            Con.Open()

            With SaveDataCMD
                .Connection = Con
                .CommandType = CommandType.Text
                .CommandText = SaveDataSQl

                .Parameters.AddWithValue("TheName", txtName.Text)
                .Parameters.AddWithValue("TheBirthDate", dtDate.Value.Date)

                .ExecuteNonQuery()
                .Dispose()
            End With
            Con.Close()
        Else
            ' الاتصال مفتوح مسبقاً
            With SaveDataCMD
                .Connection = Con
                .CommandType = CommandType.Text
                .CommandText = SaveDataSQl

                .Parameters.AddWithValue("TheName", txtName.Text)
                .Parameters.AddWithValue("TheBirthDate", dtDate.Value.Date)

                .ExecuteNonQuery()
                .Dispose()
            End With
            Con.Close()
        End If
        frmMain.LoadData()
    End Sub


وفي حدث النقر للزر إغلاق، نكتب الكود التالي:
كود :
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
        Me.Close()
    End Sub
الرد }}}
تم الشكر بواسطة: Amir_Alzubidy , الوادي , princelovelorn , 3booody , 3booody
#3
نقوم بإنشاء from جديد ونسميه frmEdit، وبه نفس العناصر الموجودة على الـfrmNew، بإمكانك نسخها من هناك ولصقها على هذا الـform.

في الـfrmMain، نكتب في حدث النقر للزر تعديل ما يلي:
كود :
Private Sub btnEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdit.Click
        If dgvList.SelectedRows(0).Cells(0).Value = Nothing Then
            MsgBox("يجب اختيار سجل لتعديله", MsgBoxStyle.Critical, "عذراً")
        Else
            With frmEdit
                .RecID = Val(dgvList.SelectedRows(0).Cells(0).Value)
                .TheName = dgvList.SelectedRows(0).Cells(1).Value
                .TheBirthDate = dgvList.SelectedRows(0).Cells(2).Value
                .ShowDialog()
            End With
        End If
    End Sub

ونقوم في هذا الكود بالتحقق من السجل المختار من قبل المستخدم في الـfrmMain وقت التشغيل، فإذا تحقق الشرط يتم إرسال القيم المختارة إلى الـfrmEdit.

نكتب في شاشة تحرير الكود للـfrmEdit وكأول سطر ما يلي:

كود :
Imports System.Data.OleDb

وفي قسم التعريفات نكتب:
كود :
' تعريف متغير يحمل رقم السجل المطلوب تعديله
    Public RecID As Integer
    Public TheName As String
    Public TheBirthDate As Date


في حدث التحميل للـfrmEdit نكتب:
كود :
Private Sub frmEdit_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' تجهيز العنصر الخاص بعرض التاريخ
        dtDate.Format = DateTimePickerFormat.Custom
        dtDate.CustomFormat = "yyyy-MM-dd"

        txtName.Text = TheName
        dtDate.Value = TheBirthDate
    End Sub


وهنا قمنا بعرض الاسم وتاريخ الميلاد ليتم عرضها أمام المستخدم حتى يمكنه التعديل.

في حدث النقر للزر حفظ، نكتب ما يلي:
كود :
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        If txtName.Text = Nothing Then
            MsgBox("يجب إدخال الاسم", MsgBoxStyle.Critical, "عذراً")
            txtName.Focus()
        Else
            SaveData()
            MsgBox("تم تعديل البيانات بنجاح", MsgBoxStyle.Information, "ألف مبروك")

            ' تحديث الداتاقريد على النافذة الرئيسية
            frmMain.LoadData()
            Me.Close()
        End If
    End Sub

وهو للتحق من أن المستخدم كتب اسماً بالفعل.

وفي حدث النقر للزر إغلاق نكتب:
كود :
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
        txtName.Text = Nothing
        RecID = 0
        TheBirthDate = Nothing
        TheName = Nothing
        Me.Close()
    End Sub

لتصفير القيم وإغلاق الـform.
الرد }}}
تم الشكر بواسطة: Amir_Alzubidy , الوادي , princelovelorn , 3booody , 3booody
#4
في الـfrmmain، وفي حدث النقر للزر حذف نكتب ما يلي:
كود :
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
        Dim RecID As Integer
        Dim Answer As Integer

        RecID = Val(dgvList.SelectedRows(0).Cells(0).Value)

        If RecID = Nothing Then
            MsgBox("لم تقم باختيار سجل لحذفه", MsgBoxStyle.Critical, "عذراً")
        Else
            Answer = MsgBox("هل تريد فعلاً حذف هذا السجل", MsgBoxStyle.Question + MsgBoxStyle.OkCancel, "تنبيه")
            If Answer = MsgBoxResult.Ok Then
                Dim DelSQl As String = "DELETE * FROM TheTable WHERE ID=" & RecID & ""
                Dim DelCMD As New OleDbCommand

                If Con.State = ConnectionState.Closed Then
                    Con.Open()

                    With DelCMD
                        .Connection = Con
                        .CommandType = CommandType.Text
                        .CommandText = DelSQl

                        .ExecuteNonQuery()
                        .Dispose()
                    End With
                    Con.Close()
                    LoadData()
                Else
                    With DelCMD
                        .Connection = Con
                        .CommandType = CommandType.Text
                        .CommandText = DelSQl

                        .ExecuteNonQuery()
                        .Dispose()
                    End With
                    Con.Close()
                    LoadData()
                End If
            End If
        End If
    End Sub

وفيه يتم عرض رسالة تنبيه للمستخدم بأنه على وشك حذف سجل، فإن وافق يتم حذف وتحديث القائمة.
الرد }}}
تم الشكر بواسطة: Amir_Alzubidy , الوادي , 3booody
#5
في الـfrmMain، ننقر صندوق النصوص الخاص بالبحث نقرتين مزدوجتين ونكتب:
كود :
Private Sub txtSearch_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
        SearchByName()
    End Sub

وهنا تم استدعاء روتين البحث، وهذه برمجته:
كود :
Private Sub SearchByName()
        Dim LSQL As String = "select * from TheTable where TheName like '%" & txtSearch.Text & "%' order by ID"
        Dim LAdapter As New OleDbDataAdapter(LSQL, Con)
        Dim LDataSet As New DataSet
        Dim RowsCount As Integer
        Dim i As Integer

        ' مسح الداتاقريدفيو من قيم سابقة محتملة
        dgvList.Rows.Clear()

        If Con.State = ConnectionState.Closed Then
            Con.Open()
            LAdapter.Fill(LDataSet, "LoadingData")
            RowsCount = LDataSet.Tables("LoadingData").Rows.Count
            If RowsCount = 0 Then
                dgvList.Rows.Clear()
                LDataSet.Reset()
                Con.Close()
                Exit Sub
            Else
                dgvList.Rows.Add(RowsCount)

                ' Now: fill DGV with data
                For i = 0 To RowsCount - 1
                    With dgvList
                        .Rows(i).Cells(0).Value = LDataSet.Tables("LoadingData").Rows(i).Item("ID")
                        .Rows(i).Cells(1).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheName")
                        .Rows(i).Cells(2).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheBirthDate")
                    End With
                Next
                LDataSet.Reset()
                Con.Close()
            End If
        Else
            LAdapter.Fill(LDataSet, "LoadingData")
            RowsCount = LDataSet.Tables("LoadingData").Rows.Count
            If RowsCount = 0 Then
                dgvList.Rows.Clear()
                LDataSet.Reset()
                Con.Close()
                Exit Sub
            Else
                dgvList.Rows.Add(RowsCount)

                ' Now: fill DGV with data
                For i = 0 To RowsCount - 1
                    With dgvList
                        .Rows(i).Cells(0).Value = LDataSet.Tables("LoadingData").Rows(i).Item("ID")
                        .Rows(i).Cells(1).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheName")
                        .Rows(i).Cells(2).Value = LDataSet.Tables("LoadingData").Rows(i).Item("TheBirthDate")
                    End With
                Next
                LDataSet.Reset()
                Con.Close()
            End If
        End If
    End Sub

والان، جرب تشغيل البرنامج، أتمنى لك الاستفادة.

وفي المرفق تجد المشروع كاملاً. السلام عليكم.


[ATTACH]3074[/ATTACH]


الملفات المرفقة
.zip   saveDate.zip (الحجم : 110.95 ك ب / التحميلات : 321)
الرد }}}
تم الشكر بواسطة: الوادي , Amir_Alzubidy , princelovelorn , 3booody , 3booody
#6
السلام عليكم
أنا شفت الفورم الرئيسي فقط و على السريع وعدلت فقط جزء من الكود بعد أذنك .
الله يعطيك العافيه .



الملفات المرفقة
.rar   saveDate.rar (الحجم : 99.29 ك ب / التحميلات : 391)
Abu Ehab : Microsoft Partner  & Systems Developer
 Youtube   Facebook    Twitter   
الرد }}}
تم الشكر بواسطة: الوادي , Amir_Alzubidy , princelovelorn , 3booody , 3booody
#7
بارك الله فيك ورزقك الجنة..
الرد }}}
تم الشكر بواسطة: الوادي , Amir_Alzubidy , 3booody
#8
بعد تعديلك في حالة الحذف.. لم تظهر رسالة التحذير، وبالتالي لم يتم الحذف.
هل حدث ذلك معك أخي أبو إيهاب؟
الرد }}}
تم الشكر بواسطة: الوادي , 3booody , 3booody
#9
لا ... أنا بكون حذر جدا وبتأكد أكثر من مرة من صحة الكود قبل لا أرفع أي شيئ لكم ,, لأتها مسؤوليه .
Abu Ehab : Microsoft Partner  & Systems Developer
 Youtube   Facebook    Twitter   
الرد }}}
تم الشكر بواسطة: الوادي , أبوبكر سويدان , 3booody , 3booody
#10
شكرا اخي الكريم
الرد }}}
تم الشكر بواسطة: أبوبكر سويدان , أبوبكر سويدان



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


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