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

نسخة كاملة : بطء في جلب البيانات
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
لمـاذا البطء في جلب البيانـات في الداتا قريدفيو على الرغم من البيانات لا تتعدي 10 اسطر

كود :
Private Sub FillCCourses()
        ' صب عرض الدرجــات حسب اســم المـادة
        If DataGridView1.Rows.Count = 0 Then Exit Sub
        For i As Integer = 0 To DataGridView1.Rows.Count - IIf(DataGridView1.AllowUserToAddRows, 2, 1)
            DataGridView1.Rows(i).Cells(4).Value = ""
            DataGridView1.Rows(i).Cells(5).Value = ""
            DataGridView1.Rows(i).Cells(6).Value = ""
        Next
        For i As Integer = 0 To DataGridView1.Rows.Count - IIf(DataGridView1.AllowUserToAddRows, 2, 1)
            Dim clasIndex As Integer = FormMin.ListBoxClas.SelectedIndex + 1
            Dim roomIndex As Integer = Me.Combroom.SelectedIndex + 1
            Dim sql As String = "select stID, on" & CombCourses.SelectedIndex + 1 & ", to" & CombCourses.SelectedIndex + 1 & ", tr" & CombCourses.SelectedIndex + 1 & " from TBL_Final1 where IDStudent=" & DataGridView1.Rows(i).Cells(0).Value & " and IDClas=" & FormMin.ListBoxClas.SelectedIndex + 1 & " and ClassroomID=" & Me.Combroom.SelectedIndex + 1 & " and SemesterID=" & Trim$(CombSemester.Text)
            Dim cm As New OleDb.OleDbCommand(sql, Con)
            cm.Parameters.AddWithValue("IDStudent", DataGridView1.Rows(i).Cells(0).Value)
            cm.Parameters.AddWithValue("IDClas", FormMin.ListBoxClas.SelectedIndex + 1)
            cm.Parameters.AddWithValue("ClassroomID", Me.Combroom.SelectedIndex + 1)
            cm.Parameters.AddWithValue("SemesterID", Trim$(CombSemester.Text))

            Try
                If Con.State = ConnectionState.Closed Then Con.Open()
                Dim dr As OleDb.OleDbDataReader = cm.ExecuteReader
                If dr.Read Then

                    DataGridView1.Rows(i).Cells(4).Value = dr(1)
                    DataGridView1.Rows(i).Cells(5).Value = dr(2)
                    DataGridView1.Rows(i).Cells(6).Value = dr(3)

                End If
                dr.Close()

            Catch ex As Exception
                MessageBox.Show("خطأ: " & ex.Message)
            Finally
                If Con.State = ConnectionState.Open Then Con.Close()
            End Try
        Next

    End Sub

واستخدمت هذا الكود ولكن لم يضبط معي
كود :
' صب عرض الدرجــات حسب اســم المـادة
        If DataGridView1.Rows.Count = 0 Then Exit Sub

        Dim sql As String = "select IDStudent, on" & CombCourses.SelectedIndex + 1 & ", to" & CombCourses.SelectedIndex + 1 & ", tr" & CombCourses.SelectedIndex + 1 & " from TBL_Final1 where IDClas=@IDClas and ClassroomID=@ClassroomID and SemesterID=@SemesterID"
        Dim dt As New DataTable()
        Using Con As New OleDb.OleDbConnection("...")
            Con.Open()
            Using cmd As New OleDb.OleDbCommand(sql, Con)
                cmd.Parameters.AddWithValue("@IDClas", FormMin.ListBoxClas.SelectedIndex + 1)
                cmd.Parameters.AddWithValue("@ClassroomID", Me.Combroom.SelectedIndex + 1)
                cmd.Parameters.AddWithValue("@SemesterID", Trim$(CombSemester.Text))

                Using adapter As New OleDb.OleDbDataAdapter(cmd)
                    adapter.Fill(dt)
                End Using
            End Using
        End Using

        For Each row As DataRow In dt.Rows
            For i As Integer = 0 To DataGridView1.Rows.Count - 1
                If DataGridView1.Rows(i).Cells(0).Value.ToString() = row("IDStudent").ToString() Then
                    DataGridView1.Rows(i).Cells(4).Value = row(1)
                    DataGridView1.Rows(i).Cells(5).Value = row(2)
                    DataGridView1.Rows(i).Cells(6).Value = row(3)
                    Exit For
                End If
            Next
        Next
هذا مثال لمشكلة بطء جلب البيانات في الداتا قريدفيو
اختر الفصل الأول من الليست بوكس في الفورم الرئيسي
ثم اختر  من الكومبوكس أعمال الفصل
ومن قائمــة رصد الدرجـات - أعمال الفصل

وفي الفورم  FormSemester1
اختر من الكومبوكس Combroom - اسم القسم (عام)
ثم من الكومبوكس CombCourses - اختر أي مادة
سوف تلاحظ بطء في جلب البيانات

[attachment=30076]
جرب الكود بالطريقة التالية

كود :
   Private Sub FillCCourses()
       ' صب عرض الدرجــات حسب اســم المـادة
       If Con.State = ConnectionState.Closed Then Con.Open()
       If DataGridView1.Rows.Count = 0 Then Exit Sub
       For i As Integer = 0 To DataGridView1.Rows.Count - IIf(DataGridView1.AllowUserToAddRows, 2, 1)
           DataGridView1.Rows(i).Cells(4).Value = ""
           DataGridView1.Rows(i).Cells(5).Value = ""
           DataGridView1.Rows(i).Cells(6).Value = ""
           Dim clasIndex As Integer = FormMin.ListBoxClas.SelectedIndex + 1
           Dim roomIndex As Integer = Me.Combroom.SelectedIndex + 1
           Dim sql As String = "select stID, on" & CombCourses.SelectedIndex + 1 & ", to" & CombCourses.SelectedIndex + 1 & ", tr" & CombCourses.SelectedIndex + 1 & " from TBL_Final1 where IDStudent=" & DataGridView1.Rows(i).Cells(0).Value & " and IDClas=" & FormMin.ListBoxClas.SelectedIndex + 1 & " and ClassroomID=" & Me.Combroom.SelectedIndex + 1 & " and SemesterID=" & Trim$(CombSemester.Text)
           Dim cm As New OleDb.OleDbCommand(sql, Con)
           cm.Parameters.AddWithValue("IDStudent", DataGridView1.Rows(i).Cells(0).Value)
           cm.Parameters.AddWithValue("IDClas", FormMin.ListBoxClas.SelectedIndex + 1)
           cm.Parameters.AddWithValue("ClassroomID", Me.Combroom.SelectedIndex + 1)
           cm.Parameters.AddWithValue("SemesterID", Trim$(CombSemester.Text))
           Try
               Dim dr As OleDb.OleDbDataReader = cm.ExecuteReader
               If dr.Read Then
                   DataGridView1.Rows(i).Cells(4).Value = dr(1)
                   DataGridView1.Rows(i).Cells(5).Value = dr(2)
                   DataGridView1.Rows(i).Cells(6).Value = dr(3)
               End If
               dr.Close()
           Catch ex As Exception
               MessageBox.Show("خطأ: " & ex.Message)
           Finally
           End Try
       Next
       If Con.State = ConnectionState.Open Then Con.Close()
   End Sub
(06-05-25, 07:57 PM)princelovelorn كتب : [ -> ]جرب الكود بالطريقة التالية

كود :
   Private Sub FillCCourses()
       ' صب عرض الدرجــات حسب اســم المـادة
       If Con.State = ConnectionState.Closed Then Con.Open()
       If DataGridView1.Rows.Count = 0 Then Exit Sub
       For i As Integer = 0 To DataGridView1.Rows.Count - IIf(DataGridView1.AllowUserToAddRows, 2, 1)
           DataGridView1.Rows(i).Cells(4).Value = ""
           DataGridView1.Rows(i).Cells(5).Value = ""
           DataGridView1.Rows(i).Cells(6).Value = ""
           Dim clasIndex As Integer = FormMin.ListBoxClas.SelectedIndex + 1
           Dim roomIndex As Integer = Me.Combroom.SelectedIndex + 1
           Dim sql As String = "select stID, on" & CombCourses.SelectedIndex + 1 & ", to" & CombCourses.SelectedIndex + 1 & ", tr" & CombCourses.SelectedIndex + 1 & " from TBL_Final1 where IDStudent=" & DataGridView1.Rows(i).Cells(0).Value & " and IDClas=" & FormMin.ListBoxClas.SelectedIndex + 1 & " and ClassroomID=" & Me.Combroom.SelectedIndex + 1 & " and SemesterID=" & Trim$(CombSemester.Text)
           Dim cm As New OleDb.OleDbCommand(sql, Con)
           cm.Parameters.AddWithValue("IDStudent", DataGridView1.Rows(i).Cells(0).Value)
           cm.Parameters.AddWithValue("IDClas", FormMin.ListBoxClas.SelectedIndex + 1)
           cm.Parameters.AddWithValue("ClassroomID", Me.Combroom.SelectedIndex + 1)
           cm.Parameters.AddWithValue("SemesterID", Trim$(CombSemester.Text))
           Try
               Dim dr As OleDb.OleDbDataReader = cm.ExecuteReader
               If dr.Read Then
                   DataGridView1.Rows(i).Cells(4).Value = dr(1)
                   DataGridView1.Rows(i).Cells(5).Value = dr(2)
                   DataGridView1.Rows(i).Cells(6).Value = dr(3)
               End If
               dr.Close()
           Catch ex As Exception
               MessageBox.Show("خطأ: " & ex.Message)
           Finally
           End Try
       Next
       If Con.State = ConnectionState.Open Then Con.Close()
   End Sub

باركــ الله فيكـــــ أخـي الحبيب princelovelorn
أفضـل من قبــل بكثير
خيرٌ من سرعـــة السُلحفاة هههههههه
إقتباس :باركــ الله فيكـــــ أخـي الحبيب princelovelorn
أفضـل من قبــل بكثير
خيرٌ من سرعـــة السُلحفاة هههههههه

اللهم أمين وإياكم أخي 

الحمد لله والشكر لله
تاكد انك لا تستدعي جلب البيانات اكثر مره
(07-05-25, 10:02 AM)Zuhare كتب : [ -> ]تاكد انك لا تستدعي جلب البيانات اكثر مره

أجرب المرفق وأخبرك بالنتيجة

الأساتذة الكرام
princelovelorn
Zuhare

صنيعكم جميل طوق عنقي
أخي Zuhare
التعديل في منتهى الروعة وجاء بالنتيجة التي كنت أريدها بالضبط
فلا شلت يمينك أنت والأخ الفاضل المفضال
princelovelorn
أخي Zuhare
قمت بإفراغ جدول الدرجات ثم استدعاء بيانات الطلبة فلاخظت الٱتي:
أولا: لم يتم جلب البيانات من جدول الطلاب.
والمفروض يجب جلب البيانات حسب الصف والقسم حتى يتم تسجيل الدرجات حسب المادة ورقم الامتحان.
ثانيا: يتم استدعاء الدرجات حسب IDSemester
والمادة المختار

في العموم لو تم تعديل المثال وفق المطلوب فحتما سيكون مثالا ممتازا
ملاحظة :
عند طلب تنفيذ كود بحلقة تكرارية عليك مراعات :
- عدم تكرار الأكواد التي لا داعي لها ضمن الحلقة (في المثال هنا - فتح واغلاق قاعدة البيانات مع كل دورة لا داعي له).
- لا تستخدم عناصر من نافذة أو كائن مرئي، استبدلها بمتغيرات. :
   . يعني عليك استخدام متغيرات تقوم باسناد قيم العناصر المرئية لتلك المتغيرات.. ثم تقوم بتنفيذ الحلقة التكرارية على تلك المتغيرات وليس الكائنات المرئية.
   . الفرق بين سرعة استخدام حلقة تكرارية لمتغيرات عن كائنات مرئية أكثر من 20 ضعف بل هذا رقم صغير جداً بالنسبة لبعض الأجهزة وستلاحظ هذا بوضوح كلما كبر أو كثر عدد السجلات.

في كودك هذا استخدمت عناصر مرئية منها : 
     CombCourses.SelectedIndex
     FormMin.ListBoxClas.SelectedIndex
     Me.Combroom.SelectedIndex
     CombSemester.Text
     بإمكانك تخزين كل واحدة منها في متغير - قبل الدخول للحلقة ومن ثم تستخدم المتغير.

     DataGridView1.Rows(i).Cells(0).Value
     بإمكانك تخزين القيم ضمن مصفوفة قبل الدخول للحلقة وتستخدم المصفوفة ضمن الحلقة.
نصيحة بجمل
1. تخزين القيم في متغيرات قبل الدخول للحلقة:

Dim C As Integer = FormMin.ListBoxClas.SelectedIndex
Dim R As Integer = Me.Combroom.SelectedIndex
Dim S As String = CombSemester.Tex

2. ' تخزين القيم في مصفوفة قبل الدخول للحلقة

Dim valuesArray(dt.Rows.Count - 1, 3) As Object
For i As Integer = 0 To dt.Rows.Count - 1
   valuesArray(i, 0) = dt.Rows(i).Item(0).ToString
   valuesArray(i, 1) = dt.Rows(i).Item(1).ToString
   valuesArray(i, 2) = dt.Rows(i).Item(2).ToString
   valuesArray(i, 3) = dt.Rows(i).Item(3).ToString
Next