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

نسخة كاملة : مساعدة في كود استيراد يانات
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام  عليكم ورحمة الله وبركاته 
اخوتي العزاء انااقوم ببرمجة لعة من سيربح المليون ووضعت الاسئلة في قاعدة اكسس لكن واجهني مشكلة لا استطيع استراد الاسئلة من القاعدة ولا  الاجابات بشكل عشوائي من الاكسس احتاج كود يقوم باستراد الاسئلة والاجابات بشكل عشوائي الي الليبول بوكس
شكرا 
للاستدعاء العشوائي للبيانات من عمود في قاعدة بيانات Access وعرضها في عنصر تحكم Label باستخدام VB.NET، يمكنك اتباع الخطوات التالية:
الخطوات
إضافة المكتبات اللازمة:
تأكد من إضافة المكتبة الخاصة بـ OLE DB في مشروعك. يمكنك القيام بذلك عن طريق استيراد الأسماء التالية في أعلى الكود الخاص بك:

كود :
Imports System.Data.OleDb

إنشاء الاتصال بقاعدة البيانات:
قم بإنشاء سلسلة اتصال (Connection String) لقاعدة البيانات الخاصة بك.
كتابة الكود لاستدعاء البيانات:
استخدم الكود التالي لاستدعاء بيانات عشوائية من عمود معين:

كود :
Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=مسار_قاعدة_البيانات.accdb;"
Dim query As String = "SELECT اسم_العمود FROM اسم_الجدول"

Using connection As New OleDbConnection(connectionString)
  Dim command As New OleDbCommand(query, connection)
  connection.Open()
 
  Dim reader As OleDbDataReader = command.ExecuteReader()
  Dim values As New List(Of String)

  While reader.Read()
      values.Add(reader("اسم_العمود").ToString())
  End While

  ' توليد رقم عشوائي لاختيار قيمة
  Dim random As New Random()
  Dim randomIndex As Integer = random.Next(0, values.Count)

  ' عرض القيمة العشوائية في Label
  LabelName.Text = values(randomIndex) ' استبدل LabelName باسم Label الخاص بك
 
  reader.Close()
End Using

الشرح
Connection String: تأكد من تعديل مسار_قاعدة_البيانات.accdb ليعكس المسار الفعلي لملف قاعدة البيانات الخاص بك.
Query: قم بتعديل "اسم_العمود" و"اسم_الجدول" لتناسب هيكل قاعدة البيانات لديك.
Random Selection: يتم إنشاء قائمة بالقيم المسترجعة، ثم يتم اختيار قيمة عشوائية منها باستخدام كائن Random.
بهذا الشكل، يمكنك استدعاء بيانات عشوائية من عمود في قاعدة بيانات Access وعرضها في عنصر تحكم Label باستخدام VB.NET.
شكرا لك اخي الكريم ولكن اريد ان اسئلك سؤال هل الاسئل ممكن تكرر وكيف اقضي علي احتمالية تكرار نفس السؤال شكرا
(30-12-24, 09:11 PM)fireswored1 كتب : [ -> ]شكرا لك اخي الكريم ولكن اريد ان اسئلك سؤال هل الاسئل ممكن تكرر وكيف اقضي علي احتمالية تكرار نفس السؤال شكرا

لضمان عدم التكرار
كود :
Private Sub btnGetRandomData_Click(sender As Object, e As EventArgs) Handles btnGetRandomData.Click
   Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=مسار_قاعدة_البيانات.accdb;"
   Dim query As String = "SELECT اسم_العمود FROM اسم_الجدول"

   Using connection As New OleDbConnection(connectionString)
       Dim command As New OleDbCommand(query, connection)
       connection.Open()

       ' قراءة جميع القيم من العمود
       Dim reader As OleDbDataReader = command.ExecuteReader()
       Dim values As New List(Of String)

       While reader.Read()
           values.Add(reader("اسم_العمود").ToString())
       End While

       reader.Close()

       ' استخدام مجموعة لتخزين القيم التي تم اختيارها مسبقاً
       Dim selectedValues As New HashSet(Of String)()

       ' توليد رقم عشوائي لاختيار قيمة
       Dim random As New Random()
       
       If values.Count > 0 Then
           ' اختيار قيمة عشوائية غير متكررة
           Dim randomIndex As Integer
           Do
               randomIndex = random.Next(0, values.Count)
           Loop While selectedValues.Contains(values(randomIndex))

           ' إضافة القيمة المختارة إلى المجموعة
           selectedValues.Add(values(randomIndex))

           ' عرض القيمة العشوائية في Label
           LabelName.Text = values(randomIndex) ' استبدل LabelName باسم Label الخاص بك
       Else
           MessageBox.Show("لا توجد بيانات في العمود المحدد.")
       End If
   End Using
End Sub
شكرا لحضرتك لكن ظهر مشكلة اخيرة وهيا الستدعاء الاجبات من نفس الرقم العشوائي هل لها حل
(31-12-24, 01:07 AM)fireswored1 كتب : [ -> ]شكرا لحضرتك لكن ظهر مشكلة اخيرة وهيا الستدعاء الاجبات من نفس الرقم العشوائي هل لها حل

المثال التالي كامل يعمل جيدا وتمت تجربته
المطلوب
قاعدة بيانات أكسس 
بها جدول أسمه  Questions يحتوي على الأعمدة التالية 
ID 
Question حقل نصي وفيه ستضع الأسئلة
  OptionA حقل نصي وفيه الأجابة الأولى
  OptionB حقل نصي وفيه الأجابة الثانية
  OptionC حقل نصي وفيه الأجابة الثالثة
  OptionD حقل نصي وفيه الأجابة الرابعة
CorrectAnswer  حقل نصي وفيه ستضع الأجابة الوحيدة الصحيحة مما سبق


أفتح مشروع جديد
form1
أضف الأدوات التالية
 LabelQuestion
           ButtonA
           ButtonB
           ButtonC
           ButtonD

ثم أضف الكود التالي كاملا في form1
كود :
Imports System.Data.OleDb

Public Class Form1



   Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=مسار_قاعدة_البيانات.accdb;"
   Dim questions As New List(Of Question)()
   Dim currentQuestionIndex As Integer = 0

   Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       LoadQuestions()
       DisplayQuestion()
   End Sub

   Private Sub LoadQuestions()
       Using connection As New OleDbConnection(connectionString)
           Dim command As New OleDbCommand("SELECT * FROM Questions", connection)
           connection.Open()
           Dim reader As OleDbDataReader = command.ExecuteReader()

           While reader.Read()
               Dim q As New Question()
               q.ID = reader("ID")
               q.Text = reader("Question").ToString()
               q.OptionA = reader("OptionA").ToString()
               q.OptionB = reader("OptionB").ToString()
               q.OptionC = reader("OptionC").ToString()
               q.OptionD = reader("OptionD").ToString()
               q.CorrectAnswer = reader("CorrectAnswer").ToString()
               questions.Add(q)
           End While
       End Using
   End Sub

   Private Sub DisplayQuestion()
       If currentQuestionIndex < questions.Count Then
           Dim question As Question = questions(currentQuestionIndex)
           LabelQuestion.Text = question.Text
           Buttona.Text = question.OptionA
           Buttonb.Text = question.OptionB
           Buttonc.Text = question.OptionC
           Buttond.Text = question.OptionD
       Else
           MessageBox.Show("انتهت الأسئلة!")
       End If
   End Sub

   Private Sub Button_Click(sender As Object, e As EventArgs) Handles Buttona.Click, Buttonb.Click, Buttonc.Click, Buttond.Click
       Dim selectedButton As Button = CType(sender, Button)
       Dim selectedAnswer As String = selectedButton.Text

       If selectedAnswer = questions(currentQuestionIndex).CorrectAnswer Then
           MessageBox.Show("إجابة صحيحة!")
       Else
           MessageBox.Show("إجابة خاطئة! الإجابة الصحيحة هي: " & questions(currentQuestionIndex).CorrectAnswer)
       End If

       currentQuestionIndex += 1
       DisplayQuestion()
   End Sub

End Class

Public Class Question
   Public Property ID As Integer
   Public Property Text As String
   Public Property OptionA As String
   Public Property OptionB As String
   Public Property OptionC As String
   Public Property OptionD As String
   Public Property CorrectAnswer As String
End Class


حتى الأن الفكرة تعمل بشكل جيد
عليك التعديل في التصميم على حسب رؤيتك
ولا تنسي تغيير مسار القاعدة في الكود 

أتمنى أن أكون وفقت في الشرح
لإتمام عملية استيراد الأسئلة والإجابات من قاعدة بيانات Access بشكل عشوائي وإظهارها في عناصر مثل Label أو ListBox في تطبيقك بلغة Visual Basic.NET، يمكنك استخدام الكود التالي:
الخطوات
  1. تأكد من أنك قد أنشأت قاعدة البيانات وقمت بإضافة جدول يحتوي على الأعمدة المناسبة للأسئلة والإجابات.
  2. أضف مرجعًا لـ System.Data.OleDb في مشروعك للتعامل مع قواعد بيانات Access.
  3. استخدم الكود التالي لاستيراد البيانات بشكل عشوائي.
الكود
vb.net
نسخ الكود
كود :
Imports System.Data.OleDb

Public Class Form1
   ' استبدل بمسار قاعدة البيانات الخاص بك
   Private Const DbPath As String = "C:\PathToYourDatabase\QuestionsDatabase.accdb"
   Private ConnectionString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={DbPath};"

   ' جلب سؤال عشوائي وإظهاره
   Private Sub LoadRandomQuestion()
       Dim query As String = "SELECT TOP 1 * FROM Questions ORDER BY RND(ID)"
       Dim questionText As String = ""
       Dim answer1 As String = ""
       Dim answer2 As String = ""
       Dim answer3 As String = ""
       Dim answer4 As String = ""

       Using conn As New OleDbConnection(ConnectionString)
           Dim cmd As New OleDbCommand(query, conn)
           conn.Open()
           Dim reader As OleDbDataReader = cmd.ExecuteReader()

           If reader.Read() Then
               questionText = reader("Question").ToString()
               answer1 = reader("Answer1").ToString()
               answer2 = reader("Answer2").ToString()
               answer3 = reader("Answer3").ToString()
               answer4 = reader("Answer4").ToString()
           End If
           reader.Close()
       End Using

       ' عرض السؤال والإجابات في واجهة المستخدم
       lblQuestion.Text = questionText
       lstAnswers.Items.Clear()
       lstAnswers.Items.Add(answer1)
       lstAnswers.Items.Add(answer2)
       lstAnswers.Items.Add(answer3)
       lstAnswers.Items.Add(answer4)
   End Sub

   ' استدعاء الوظيفة عند تحميل الفورم
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       LoadRandomQuestion()
   End Sub
End Class
ملاحظات
  1. هيكل قاعدة البيانات:
    • تأكد من أن لديك جدولًا باسم Questions يحتوي على الأعمدة:
      • ID: (رقم تلقائي أو مفتاح أساسي)
      • Question: نص السؤال
      • Answer1, Answer2, Answer3, Answer4: الإجابات المختلفة.
  2. الاستعلام العشوائي:
    • نستخدم
      ORDER BY RND(ID)
    • لجلب صف عشوائي من الجدول.
  3. التعامل مع المكونات:
    • استبدل
      lblQuestion
    • و
      lstAnswers
    • بالأسماء المناسبة للعناصر لديك.
  4. إضافة الإجابات بشكل عشوائي:
    • إذا أردت خلط الإجابات داخل الـ
      ListBox
    • ، يمكنك استخدام الشيفرة التالية:
      vb.net
      نسخ الكود
      Dim random As New Random()Dim shuffledAnswers = lstAnswers.Items.Cast(Of String)().OrderBy(Function() random.Next()).ToList()lstAnswers.Items.Clear()lstAnswers.Items.AddRange(shuffledAnswers.ToArray())
تشغيل الكود
  1. انسخ الكود أعلاه في مشروع Windows Forms.
  2. تأكد من تحديث المسار إلى قاعدة البيانات
    DbPath
  3. .
  4. شغّل التطبيق للتأكد من أن الأسئلة والإجابات تظهر بشكل صحيح وعشوائي.
اخي الكريم شكرا لك علي المساعدة ولكن هذا الكود يقوم بعمل اخطاء عندي كمثال انا لا اضع بداية الاسئلة في بوتونبوكس بل افعل شئ اخر لو يكون في شرح لكل كود اكون مشكور انا احتاج اضغط عل زر ابداء فيداء سرد الاسئلة واخفاء البوتون الذي قام إدخاله وبعد الانتهاء من الاسئلة او اجب اجابة خاطئة يظهر بوتون بداية الاسئلة من جديد ولكن ليست هذه المشكلة الكود الذي قمنا به في استدعاء الاسئلة شكل عشوائي كان فعال احتاج شئ بداخله يقوم باستدعاء الاجاات ايضا في نفس صف السؤال واستيرادهم علي ليبول بوكس او بوتون بوكس وهناك سيكون بوتون اوليبول بوكس زائد سيرفع به الاجابة الصحيحة وحين الضغط علي اي اجابة من الاربعه ساقوم باضافة كود يطابق هذا البوتون او الليبول الاجابة الصحيحة  
لإتمام عملية استيراد الأسئلة والإجابات من قاعدة بيانات Access بشكل عشوائي وإظهارها في عناصر مثل Label أو ListBox في تطبيقك بلغة Visual Basic.NET، يمكنك استخدام الكود التالي:
الخطوات
  1. تأكد من أنك قد أنشأت قاعدة البيانات وقمت بإضافة جدول يحتوي على الأعمدة المناسبة للأسئلة والإجابات.

  2. أضف مرجعًا لـ System.Data.OleDb في مشروعك للتعامل مع قواعد بيانات Access.

  3. استخدم الكود التالي لاستيراد البيانات بشكل عشوائي.
الكود
vb.net
نسخ الكود
كود :

كود :
Imports System.Data.OleDb

Public Class Form1
   ' استبدل بمسار قاعدة البيانات الخاص بك
   Private Const DbPath As String = "C:\PathToYourDatabase\QuestionsDatabase.accdb"
   Private ConnectionString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={DbPath};"

   ' جلب سؤال عشوائي وإظهاره
   Private Sub LoadRandomQuestion()
       Dim query As String = "SELECT TOP 1 * FROM Questions ORDER BY RND(ID)"
       Dim questionText As String = ""
       Dim answer1 As String = ""
       Dim answer2 As String = ""
       Dim answer3 As String = ""
       Dim answer4 As String = ""

       Using conn As New OleDbConnection(ConnectionString)
           Dim cmd As New OleDbCommand(query, conn)
           conn.Open()
           Dim reader As OleDbDataReader = cmd.ExecuteReader()

           If reader.Read() Then
               questionText = reader("Question").ToString()
               answer1 = reader("Answer1").ToString()
               answer2 = reader("Answer2").ToString()
               answer3 = reader("Answer3").ToString()
               answer4 = reader("Answer4").ToString()
           End If
           reader.Close()
       End Using

       ' عرض السؤال والإجابات في واجهة المستخدم
       lblQuestion.Text = questionText
       lstAnswers.Items.Clear()
       lstAnswers.Items.Add(answer1)
       lstAnswers.Items.Add(answer2)
       lstAnswers.Items.Add(answer3)
       lstAnswers.Items.Add(answer4)
   End Sub

   ' استدعاء الوظيفة عند تحميل الفورم
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       LoadRandomQuestion()
   End Sub
End Class
ملاحظات
  1. هيكل قاعدة البيانات:
    • تأكد من أن لديك جدولًا باسم Questions يحتوي على الأعمدة:
      • ID: (رقم تلقائي أو مفتاح أساسي)
      • Question: نص السؤال
      • Answer1Answer2Answer3Answer4: الإجابات المختلفة.

  2. الاستعلام العشوائي:
    • نستخدم
      ORDER BY RND(ID)
    • لجلب صف عشوائي من الجدول.


  3. التعامل مع المكونات:
    • استبدل
      lblQuestion
    • و
      lstAnswers
    • بالأسماء المناسبة للعناصر لديك.



  4. إضافة الإجابات بشكل عشوائي:
    • إذا أردت خلط الإجابات داخل الـ
      ListBox
    • ، يمكنك استخدام الشيفرة التالية:
      vb.net
      نسخ الكود
      Dim random As New Random()Dim shuffledAnswers = lstAnswers.Items.Cast(Of String)().OrderBy(Function() random.Next()).ToList()lstAnswers.Items.Clear()lstAnswers.Items.AddRange(shuffledAnswers.ToArray())
اخي الكريم هذا الكود رائع ولكن يأتي بسوال واحد فقط نفسه في كل مرة جزاك الله خيرا
شكرا للجميع لقد قمت بحل المشكلة بالستفادة من جميع اكوادكم قمت التعديل واتت النتيجة المجرجوة سارفق الكود لاستفادة الجميع 
كود :
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Data.mdb;"
       Dim query As String = "SELECT question,Answer1,Answer2,Answer3,Answer4,CorrectAnswer FROM Questions"

       Dim answer1 As String = ""
       Dim answer2 As String = ""
       Dim answer3 As String = ""
       Dim answer4 As String = ""
       Dim CorrectAnswer As String = ""

       Using connection As New OleDbConnection(connectionString)


           Dim command As New OleDbCommand(query, connection)

           connection.Open()

           Dim reader As OleDbDataReader = command.ExecuteReader()

           Dim values As New List(Of String)
           Dim values1 As New List(Of String)
           Dim values2 As New List(Of String)
           Dim values3 As New List(Of String)
           Dim values4 As New List(Of String)
           Dim values5 As New List(Of String)

           While reader.Read()
                                   values.Add(reader("Question").ToString())
               values1.Add(reader("Answer1").ToString())
               values2.Add(reader("Answer2").ToString())
               values3.Add(reader("Answer3").ToString())
               values4.Add(reader("Answer4").ToString())
               values5.Add(reader("CorrectAnswer").ToString())


           End While

           reader.Close()

           Dim selectedValues As New HashSet(Of String)()
           Dim selectedValues1 As New HashSet(Of String)()
           Dim selectedValues2 As New HashSet(Of String)()
           Dim selectedValues3 As New HashSet(Of String)()
           Dim selectedValues4 As New HashSet(Of String)()
           Dim selectedValues5 As New HashSet(Of String)()

           Dim random As New Random()

           If values.Count > 0 Then

               Dim randomIndex As Integer

               Do
                   randomIndex = random.Next(0, values.Count)
                   randomIndex = random.Next(0, values1.Count)
                   randomIndex = random.Next(0, values2.Count)
                   randomIndex = random.Next(0, values3.Count)
                   randomIndex = random.Next(0, values4.Count)
                   randomIndex = random.Next(0, values5.Count)

               Loop While selectedValues1.Contains(values(randomIndex))


               selectedValues1.Add(values(randomIndex))

               Do
               Loop While selectedValues1.Contains(values1(randomIndex))
               selectedValues1.Add(values1(randomIndex))

               Do
               Loop While selectedValues2.Contains(values2(randomIndex))
               selectedValues1.Add(values2(randomIndex))
               Do
               Loop While selectedValues3.Contains(values3(randomIndex))
               selectedValues1.Add(values3(randomIndex))
               Do
               Loop While selectedValues4.Contains(values4(randomIndex))
               selectedValues1.Add(values4(randomIndex))
               Do
               Loop While selectedValues5.Contains(values5(randomIndex))
               selectedValues1.Add(values5(randomIndex))

               LabelQuestion.Text = values(randomIndex)

               Label2.Text = values1(randomIndex)
               Label3.Text = values2(randomIndex)
               Label4.Text = values3(randomIndex)
               Label5.Text = values4(randomIndex)
               Label6.Text = values5(randomIndex)

           Else
               MessageBox.Show("لا توجد بيانات في العمود المحدد.")

           End If

       End Using