ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Client/Serveur avec bases de données VFP   



L'auteur

Thierry
France France
Membre Simple
# 0000000016
enregistré le 13/10/2004

50 ans
PERRETIER Thierry
92800 PUTEAUX
Fiche personnelle


Note des membres
19/20
2 votes


Contributions > 07 - SQL

Client/Serveur avec bases de données VFP
# 0000000167
ajouté le 30/03/2005 00:37:02 et modifié le 30/03/2005
consulté 10789 fois
Niveau expert

Version(s) Foxpro :
VFP 9.0


Télécharger le ZIP (5.73 Ko)
Description

Ce système permet d'utiliser des données Foxpro en mode client/serveur. Il utilise VFPOLEDB.DLL, ADO et l'objet CursorAdapter.
Au vu du faible nombre de lignes de codes, il est très simple. Toutefois, ce n'est pas ODBC qui est utilisé, donc l'utilisation de SQLEXEC() ou des vues distantes ne permet pas d'exploiter le serveur de données. Il faut donc se familiariser avec ADO et l'objet CursorAdapter.

Sur le serveur :
- Compiler le projet REMOTEFOX.PJX (contenant SERVEUR.PRG) en REMOTEFOX.DLL (MTDLL)
- Configurer ce composant serveur dans le 'Service de composant" de windows 2000/XP.
- Exporter un fichier d'installation "Proxy d'application" .MSI pour la configuration des postes clients.

Sur le poste Client :
- Exécuter le fichier MSI pour le référencement du composant.
- Des exemples d'utilisation sont dans CLIENT.PRG

Technique utilisée:
Le serveur utilise ADO et le driver VFPOLEDB pour accèder aux bases de données Foxpro.
Il retourne les données au client via un objet ADO RecordSet. Grâce au système dit "COM Marshaling", lors de l'utilisation d'un composant "out-of process", le Recordset est retourné par valeur et non par référence. Le client manipule donc un RecordSet "déconnecté". Il est possible de retourner un RecordSet par référence (en le lisant avant son ouverture sur le serveur), mais dans ce cas c'est beaucoup trop lent.
Le client utilise un objet CursorAdapter pour exploiter le RecordSet. Les modifications apportées au curseur sont retournées au serveur via le RecordSet attaché au CursorAdapter. Le RecordSet est reconnecté à la source de données pour mise à jour du DBF.

Parmi les exemples, les procédures P3 et P4 utilisent une sous-classe de CursorAdapter spécialement conçue pour faciliter l'utilisation du mode client/serveur.
La procédure P2 envoit un script au serveur.
La précédure P4 utilise une procédure stockée.

Code source :
*** SERVEUR.PRG :
DEFINE CLASS serveur AS Session OLEPUBLIC

oRs=null
oConn=null
oCmd=null

PROCEDURE ConnectADO(tConnectionString as String)
    this.oConn = CreateObject("adodb.connection")
    this.oConn.Open(tConnectionString)
    this.oConn.CursorLocation= 3  && adUseClient
    this.oRs = CreateObject("adodb.recordset")
    WITH this.oRs as ADODB.Recordset
        .activeConnection=this.oConn
        .CursorType= 3  && adOpenStatic
        .LockType= 4  && adLockBatchOptimistic
    ENDWITH
    this.oCmd=CreateObject("adodb.Command")
    this.oCmd.activeConnection = this.oConn
ENDPROC

FUNCTION Query(cSql as stringas ADODB.Recordset
    IF this.oRs.State>0
        this.oRs.close
    ENDIF
    this.oCmd.commandText = cSql
    this.oRs.open(this.oCmd)
    RETURN this.oRs
ENDFUNC

FUNCTION Requery as ADODB.Recordset
    this.oRs.requery()
    RETURN this.oRs
ENDFUNC

PROCEDURE UpdateRecordSet(toRs as ADODB.Recordset)
    toRs.ActiveConnection=this.oConn
    toRs.UpdateBatch()
ENDPROC

ENDDEFINE

** Exemple d'utilisation :

LOCAL oRemote as RemoteFox.Serveur
LOCAL oRecordSet as adodb.recordset
LOCAL oCa as CursorAdapter

oRemote = CREATEOBJECTEX("RemoteFox.Serveur",REMOTE_SERVER)
oRemote.connectADO("Provider=vfpoledb;data source=c:\vfp9\samples\northwind\northwind.dbc")
oCa = NewObject("CursorAdapter")
oCa.DataSourceType="ADO"
oRecordSet=oRemote.query("select * from customers where CustomerId like 'A%' ")
oCa.UpdatableFieldList="CompanyName,ContactName"
IF NOT oCa.CursorFill(,,,oRecordSet)
    ERROR Message()
ENDIF
BROWSE && ici , modifier CompanyName et ContactName
IF NOT TableUpdate(.t.)
    ERROR Message()
ENDIF
oRecordset.MarshalOptions = 1  && adMarshalModifiedOnly
oRemote.updateRecordSet(oRecordset)
Commentaires
Aucun commentaire enregistré ...

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2021.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3