realbasic-nug.fr
[Top] [All Lists]

Re: postgresql

To: REALbasic NUG French <realbasic-nug dot fr at lists dot realsoftware dot com>
Subject: Re: postgresql
From: Michel LO <michel dot lo at albireo dot biz>
Date: Tue, 9 Jan 2007 17:45:33 +0100
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug dot fr at lists dot realsoftware dot com
References: <FA8559B7-CD58-42A0-9263-354F673206C4 at mac dot com> <5CBC8E68-6629-4BD2-A947-404B869791EE at albireo dot biz> <0C111400-12FB-4C15-A6ED-999C2F487C3E at realsoftware dot fr>

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







<Prev in Thread] Current Thread [Next in Thread>