IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP Discussion :

Fonction qui retourne un Recordset :?:


Sujet :

ASP

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 31
    Points : 18
    Points
    18
    Par défaut Fonction qui retourne un Recordset :?:
    salut,
    je me demande bien est ce q'une fonction en asp peut retourner un Recordset...
    ça fait deja qlq jours que je me galere avec ça mais sans resultat...
    voila un exemple:
    fichier "function_rs.asp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <%
    function ListerFamille ()
    	dim Conn
    	dim Base
    	Base = server.MapPath(".")+"\biblio.mdb"
    	set Conn = server.CreateObject("ADODB.Connection")
    	Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+ Base +"; Persist Security Info=False"
    	dim RS
    	set RS = server.CreateObject("ADODB.Recordset")
    	dim Query
    	Query = "select * from famille"
    	RS.Open Query, Conn,3,1
    	ListerFamille = RS
    end function
    %>
    et le fichier "test_function_rs.asp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <!--#include file="function_rs.asp" -->
    <%
    dim myRS
    set myRS = server.CreateObject("ADODB.Recordset")
    myRS = ListerFamille()
    myRS.MoveFirst
    	do while myRS.EOF=false
    		Response.Write ( RS(0).Value + " " + RS(1).Value )
    		myRS.MoveNext
    	loop
    myRS.Close
    %>
    ça donne l'erreur :"Nombre d'arguments ou affectation de propriété incorrects " pour la ligne:
    myRS = ListerFamille()

    Any ideas ???
    merci d'avance

  2. #2
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Salut,

    Oui c'est possible mais il faut soit déclarer ton recordset dans la page appelant ta fonction, soit faire TOUT ton traitement dans la fonction et donc créer et détruire ton recordset dans la fonction.
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    il faut soit déclarer ton recordset dans la page appelant ta fonction,
    c'est ce que j'ai bien fait avec les ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim myRS 
    set myRS = server.CreateObject("ADODB.Recordset") 
    myRS = ListerFamille()
    j'ai pas bien compri ta remarque...
    pour la deuxieme option, c'est pas possible dans mon cas, il faut obligatoirement renvoyer des Recordset

  4. #4
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Ah non désolé, en fait il ne faut pas faire de fonction mais une simple procédure (sub).
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    le probleme c'est que mes fonctions ne vont pas etre appeler juste en local, ils vont etre des web services via XML-RPC...
    du coup, je dois obligatoirement avoir un truc comme retour...
    en attendant, je converti mes recordsets en tableaux pour resoudre ce probleme ce qui n'est pas vraiment pratique...
    d'autre suggestion ?
    merci

  6. #6
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Dans ta fonction ListerFamille, essaie de remplacer
    par
    Et dans test_function_rs.asp, essaie de supprimer les 2 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set myRS = server.CreateObject("ADODB.Recordset")
    myRS = ListerFamille()
    et de les remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set myRS = ListerFamille()
    Remarque annexe : pense à fermer et détruire tes objets Recordset et Connection quand ils ne sont plus utiles.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    cool J1 ! cool quoi !
    enfin ça marche grace a toi !
    mille merci !
    dis, je peux en abuser un petit peu plus ?
    enfait, j'ai cru que j'ai enfin compri le mecanisme... mais c'est pas vraiment la meme chose si on passe a xml-rpc.
    bref, j'utilise http://aspxmlrpc.sourceforge.net/
    rien n'est sorcier quoi, une fois la fonction ok, vous ajouter 3 lignes au max et le tour est joué !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <!--#include file="xmlrpc.asp" -->
    <%
    function ListerFamille (param)
    	dim Conn
    	dim Base
    	Base = server.MapPath(".")+"\biblio.mdb"
    	set Conn = server.CreateObject("ADODB.Connection")
    	Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+ Base +"; Persist Security Info=False"
    	dim RS
    	set RS = server.CreateObject("ADODB.Recordset")
    	dim Query
    	Query = "select * from famille"
    	RS.Open Query, Conn,3,1
    	set ListerFamille = RS
    end function
    call addServerFunction("ListerFamille","ListerFamille")
    rpcserver
    %>
    coté client, j'ai testé chez moi avec des fonctions qui retournent des types simples (int, string...) et ça passe sans problemes...
    dans le fichier inclus "xmlrpc.asp", il est noté dessus que les Recodset, tableau, struct... sont aussi pris en charge... mais avec ces derniers chez moi, ça casse quoi !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <!--#include file="xmlrpc.asp" -->
    <%
    Dim paramList(1)
    paramList(0)= "un truc"
    'response.write("<pre>")
    set myRS = xmlRPC ("http://localhost/biblio_web_services/function_rs.asp", "ListerFamille", paramList)
    'response.write(myRS)
    'response.write("</pre>")
    myRS.MoveFirst
    	do while myRS.EOF=false
    		Response.Write ( CStr(myRS(0).Value) + " " + CStr(myRS(1).Value) )
    		myRS.MoveNext
    	loop
    myRS.Close
    %>
    ce truc me retourne l'erreur qu'un objet est requis
    normalement, pour un type simple, cette ligne est ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myVar = xmlRPC ("http://localhost/biblio_web_services/function_rs.asp", "ListerFamille", paramList)
    et je peux directement afficher myVar .
    any ideas ? y a rien dans le site officiel du XML-RPC for ASP !!!

  8. #8
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Au moment d'affecter à ta variable le résultat de ta fonction, teste si ce résultat est un objet ou non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If IsObject(MaFonction) Then
    	Set MaVariable = MaFonction()
    Else
    	MaVariable = MaFonction()
    End If
    L'inconvénient, c'est que ça oblige ton programme à calculer 2 fois le résultat de ta fonction (1 première fois pour le test, 1 deuxième pour l'affectation). Si quelqu'un connaît un meilleur moyen...

    Et pense à faire le même test à la fin de ta procédure afin de libérer ta variable objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If IsObject(MaVariable) Then
    	Set MaVariable = Nothing
    End If
    De manière générale, pense à libérer explicitement tes variables objet quand elles ne sont plus utiles (je me répète, je sais).

    D'ailleurs, il y a quelque chose de frappant dans ton code (le premier que tu as proposé).
    Ta fonction ListerFamille() crée un objet Connection puis un objet Recordset. Cet objet Recordset est renvoyé par ta fonction à la procédure principale.
    Là où ça devient frappant, c'est que l'objet Connection que tu crées dans ta fonction devrait cesser d'exister à la fin de ta fonction (libération implicite des variables). Hors, parce qu'il est nécessaire à ton Recordset (qui continue d'exister puisque c'est le résultat de ta fonction), on constate que ton objet Connection reste disponible jusqu'à la libération de l'objet Recordset dans la procédure principale.
    Pour s'en convaincre, il suffit d'ajouter 2 fois dans la procédure principale la ligne suivante (1 fois avant et 1 fois après la libération du Recordset) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response.Write myRS.ActiveConnection.ConnectionString 'SUPPRIMER CETTE LIGNE UNE FOIS LE TEST RÉALISÉ
    Ca paraît évident comme ça, mais je ne le savais pas. J'aurai appris quelque chose aujourd'hui

  9. #9
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Oula me suis fourvoyé! désolé.
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    pour mon cas, je stock mon recordset dans un tableau de Dictionary puis je libere ma connexion.
    ok merci pour tout !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43
  3. Réponses: 7
    Dernier message: 03/12/2004, 12h40
  4. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo