Ado: comment récupérer les données depuis une bd? [Résolu]

Signaler
Messages postés
67
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
13 octobre 2010
-
Messages postés
67
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
13 octobre 2010
-
Bonjour à tous,
J’essaie de développer une petite application d'un jeu éducatif.
Mon application est liée à une base de données Access.
Sur ma forme, je dois récupérer les questions déjà saisis dans la base de données (un après l'autre).
J'ai réussi à récupérer la première et la deuxième question par le moyen de ces codes:
Private Sub Command1_Click()
Set DB = New ADODB.Connection
Set RS = New ADODB.Recordset
DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=123; Data Source=" & App.Path & "\data.mdb"

       RS.Open "select * from table1", DB, adOpenDynamic, adLockOptimistic
 
Label1.Caption = RS!question1
End Sub

et pour récupérer la deuxième question voici le code:
Private Sub Command2_Click()
Set DB = New ADODB.Connection
Set RS = New ADODB.Recordset
DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=123; Data Source=" & App.Path & "\data.mdb"

       RS.Open "select * from table1", DB, adOpenDynamic, adLockOptimistic
 RS.MoveNext
Label1.Caption = RS!question1
End Sub


Mon problème est que je ne peux pas récupérer le reste des questions.
Merci

10 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Salut

Comme tu l'as fait pour la seconde question, il te suffit de faire un .MoveNext à chaque question.
Apparemment, tu requestionnes ta DB à chaque fois que tu as besoin d'une question - Ce n'est pas très utile, sauf si le contenu de la table évolue entre deux questions.
Si les questions ne changent pas d'un appel à l'autre, je te conseille de déclarer ta ADODB.Connection et ta ADODB.RecordSet dans la partie Déclaration de ta forme afin que ces objets restent vivants entre deux appels.
Dans ce cas, un simple .MoveNext à chaque fois que tu veux la question suivante suffit.

Si tu dois requestionner la table à chaque fois, il te faudra alors créer un boucle qui fera autant de .MoveNext que nécessaire, exemple en supposant que NoQuestion soit une variable définissant le numéro de la question que tu veux récupérer :
Private Sub Command2_Click()
Set DB = New ADODB.Connection
Set RS = New ADODB.Recordset
DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=123; Data Source=" & App.Path & "\data.mdb"

       RS.Open "select * from table1", DB, adOpenDynamic, adLockOptimistic
       For r = 1 To NoQuestion
           If Not RS.EOF Then RS.MoveNext
       Next r
Label1.Caption = RS!question1
End Sub

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
67
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
13 octobre 2010

merci infiniment jack
ça marche bien maintenant
Messages postés
67
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
13 octobre 2010

Bonjour Jack et veuillez m’excuser!

Je ne sais pas pourquoi ce code ne veut pas marcher avec moi?

Private Sub Command2_Click()
Set DB = New ADODB.Connection
Set RS = New ADODB.Recordset
DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=123; Data Source=" & App.Path & "\data.mdb"

       RS.Open "select * from table1", DB, adOpenDynamic, adLockOptimistic
       For r = 1 To NoQuestion
           If Not RS.EOF Then RS.MoveNext
       Next r
Label1.Caption = RS!question1
End Sub
Messages postés
540
Date d'inscription
mardi 4 août 2009
Statut
Membre
Dernière intervention
1 février 2013
1
quel est donc le problème avec ce code?

Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
"ça marche pas" ou "ne veut pas marcher" ne veulent rien dire
Ça ne décrit pas ce qui se passe.
As-tu une erreur ? laquelle ? sur quelle ligne ?
Impossible donc de te dire où est le problème.

As-tu remplacé NoQuestion par TA variable représentant le numéro de la question à rechercher ?
Messages postés
67
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
13 octobre 2010

Bonjour jack
Le méssage d'érreur que je reçois est lié avec la définition du variable r.
As-tu remplacé NoQuestion par TA variable représentant le numéro de la question à rechercher ?

En fait, Je suis débutant et je suis loin pour comprendre tout ça! Surtout question des variables!!!
Cordialement
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Comme je le disais récemment, essaye de comprendre les lignes que tu collectionnes, c'est un minimum.
Mettre bout à bout du code et attendre que 'ça tombe en marche' n'est pas la bonne solution.
Je t'ai proposé :
- une simple boucle For-Next : Regarde dans l'aide comment ça marche
- un If (voir l'aide) avec un attribut .EOF devant le .MoveNext afin de ne pas tomber en défaut si tu arrives en fin de liste

For r = x To y
signifie que la boucle va utiliser la variable r pour lui donner successivement les valeurs comprises entre x et y : c'est pas compliqué.
Donc, dans ton cas, entre 1 et le numéro de la question que tu recherches.
Si le compilateur te dit que tu n'as pas défini une variable, il te suffit de la définir !
Dim r As Long

La plupart du temps, les messages d'erreurs expliquent le pourquoi du problème : il suffit de lire !
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Pour ce qui est de la variable NoQuestion :
Tu demandes dans la question de ce forum à pouvoir lire la Xième question contenue dans une table.
Il va de soit qu'il faut, qu'à un moment ou un autre, le programme connaisse la valeur que tu recherches, non ?
Donc il suffit de mettre ce numéro dans une variable que j'ai arbitrairement appelée NoQuestion.
A toi de gérer ce simple numéro.

Relit aussi ma première réponse : elle nécessite peut-être plus de modif, mais simplifiera le .MoveNext pour désigner 'la suivante' sans se soucier du numéro de la question.

Apprends aussi à déboguer, c'est à dire suivre ligne après ligne ce que ton programme fait, en espionnant le contenu des variables, voir comment elles évoluent : ça t'aidera à voir ce qu'il manque.
- F9 sur une ligne de code
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 pour avancer d'une ligne de code
- F5 pour continuer normalement
Messages postés
67
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
13 octobre 2010

Je suis désolé jack je vous ai causé beaucoup de peine!
En fait avec votre première proposition(rs.movenext), le code marche bien .
G'est avec curiosité que je voulais testé votre dernier code.
Pour l'instant je me trouve face a un autre problème. Je me bas pour le résoudre. Je reviens si j'arrive pas à le surmonter.
Thanks a million jack!
Messages postés
67
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
13 octobre 2010

Bonsoir jack

je suis revenu!

Tout d'abord j'aimerais vous donner une idée sur ma petite application.

Je suis enseignant et j'ai l'intention de développer un jeu éducatif pour mes élèves similaire au fameux jeux "Qui veut gagner des millions".

Ma table db se forme donc de six champs (colonnes)



C'est juste une idée simple sur ma table.

Donc pour appeler ces données sur la forme je me suis servi de ce code et et tout se passe très bien jusque là.

voici le code:
Dim DB           As ADODB.Connection
Dim RS           As ADODB.Recordset
Const TABLE_NAME      As String = "Table1"
Const FIELD_QUESTION_NAME  As String = "question"
Const FIELD_INDEX_NAME   As String = "Numero"
Private Sub Command1_Click(Index As Integer)
 If DB Is Nothing Then
    Set DB = New ADODB.Connection
    Set RS = New ADODB.Recordset
    DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"
  End If
  RS.Open "SELECT * FROM " & TABLE_NAME & " WHERE " & FIELD_INDEX_NAME & "=" & Index, DB, adOpenDynamic, adLockOptimistic
  If RS.EOF And RS.BOF Then
    MsgBox "Pas de question N° " & Index
  Else
    Label1.Caption = RS.Fields(FIELD_QUESTION_NAME)
Option1(0).Caption = RS!reponse1
Option1(1).Caption = RS!reponse2
Option1(2).Caption = RS!reponse3
Option1(3).Caption = RS!reponse4
    RS.Close
  End If
End Sub


Arrivant maintenant au choix de réponses:
Là je suis perdu (completely stuck)!!!
Prenant l’exemple de la première question:
la deuxième réponse est présumée correcte et bien-sur elle représente le caption de option1(1) :
Donc j'ai fais ceci:
If Option1(1).Value True And Option1(1).Caption RS!reponse2 Then
Form2.Show
Else
Form3.Show
End If


Ce code me donne toujours un faux résultat et je ne sais pas pourquoi!!
C'est toujours form3 qui parait!
Cordialement.