Un petit ajout par rapport au code de Michel :
while not rs.eof
toto=rs.IdxField(1).StringValue
rs.moveNext()
wend
Ah oui, pardon, le movenext, sinon => boucle infinie.
attention, bug :
une fois sorti de la boucle (one fois atteint eof), lesmovenext move
previous sont bloqués, cela reste sur l'eof
Autre chose : si on est en SQLlite, il faut un utilitaire de
visualtion du contenu des tables pour vérifier ce qui s'est passé
dans le débug.
Pour cela, vous avez SQLLite Database Browser (pas très cher et
simple mais très efficace).
Je recommande de ne prendre que les SQL de base et pas les
instructions particulières de postgreSQL. En faisant cela, le code
reste parfaitement niskel quelque soit la abse.
C'est utile par exemple, si dans le futur, au lieu que les logiciels
attaquent une base sur le serveur de fichiers en réseau local, ils
utilisent directement internet pour aller sur un serveur via http:
Dans ce cas, il suffira d'installer RealSQLServer sur le serveur qui
utilise le web et changer l'ouverture de la base (le connect). Tout
le reste du code restera fonctionnel sans aucun changement.
il faut utiliser rs.moveNext(), pour déplacer le curseur dans le
recordSet.
Pour quelqu'un qui vient du monde 4D, un recordSet correspond a une
sélection courante et le curseur correspond a l'enregistrement
courant.
C'est bien sur une vue simplifiée car tu n'as pas de verrouillage
d'enregistrement comme dans 4D et tu as accès a la puissance des
requêtes SQL.
Pour faire propre on peut a la suite de la boucle appeler rs.close
() pour libérer la mémoire.
Pour résumer, pour lire des données dans une base de donnée, on a
une structure de code suivant :
query = "" // On renseigne la requête.
rectSet = base.SQLSelect(query) // On exécute la requête.
if rectSet <> Nil then
While Not rectSet.eof // tant que l'on est pas a la fin du
recordSet
// Ici on récupère les données de l'enregistrement sur lequel
pointe le curseur
rectSet.MoveNext() // On déplace le curseur sur
l'enregistrement suivant
Wend
rectSet.Close() // On ferme le recorSet
end if
Une autre petite chose :
à la place de
toto=rs.IdxField(1).StringValue
il est possible de faire référence a un champ par son nom :
toto = rs.field("NomDuChamp").stringValue
Cela est plus pratique a la lecture mais moins rapide a
l'exécution. Dans le cas de quelques milliers d'enregistrement,
cela n'est pas gênant par contre il peut falloir en tenir compte
sur des recordSet beaucoup plus important.
Cordialement,
Olivier Corouge
---
Olivier Corouge
Support Technique en Français
olivier at realsoftware dot fr - http://www.realsoftware.fr
|