2010-05-05 7 views
0

Je n'ai fait aucun ASP classique depuis quelques années et maintenant j'essaie d'y revenir de C# est impossible! J'ai une fonction récursive qui est très simplement supposée interroger une base de données basée sur une valeur passée à la fonction et une fois que la fonction a cessé de s'appeler elle retourne le jeu d'enregistrements .... mais je reçois le message d'erreur '80020009' . J'ai déclaré le jeu d'enregistrements en dehors de la fonction.Fonction ASP récursive classique

Quelqu'un peut-il voir l'erreur dans mes habitudes?

Dim objRsTmp 

Function buildList(intParentGroupID) 

Set objRsTmp = Server.CreateObject("Adodb.Recordset") 
SQLCommand = "SELECT * FROM tblGroups WHERE tblGroups.intParentGroupID = " & intParentGroupID & ";" 
objRsTmp.Open SQLCommand, strConnection, 3, 3 

If Not objRsTmp.Eof Then 

    While Not objRsTmp.Eof 

    Response.Write(objRsTmp("strGroup") & "<br />") 

    buildList(objRsTmp("intID")) 

    objRsTmp.MoveNext 

    Wend 

End If 

Set buildList = objRsTmp 

'#objRsTmp.Close() 
'Set objRsTmp = Nothing 

End Function 

Set objRs = buildList(0) 

If Not objRs.Eof Then 

Response.Write("There are records") 

While Not objRs.Eof 

    For Each oFld in objRs.Fields 
    Response.Write(oFld.Name & ": " & oFld.Value & ",") 
    next 

    Response.Write("<br />") 

    objRs.MoveNext 

Wend 

End If 

Toute assistance serait grandement appréciée.

Cordialement, Al

+0

Votre code est vulnérable à l'injection sql –

Répondre

2

Il y a une seule instance de objRsTmp dans le contexte global, ce qui signifie son partage entre tous les buildList() sur la pile; donc chaque fois que vous vous recurerez en buildList() et appelez objRsTmp.Open() votre causant la précédente buildList() sur la pile pour utiliser le nouveau objRsTmp.

Je ne pense pas que ce soit ce que vous avez en tant que votre boucle ses lignes comme si chaque buildList() avait son propre ensemble de résultats. Pour ce faire, vous devez rendre le jeu d'enregistrements local ... mais c'est un moyen très coûteux de le faire, en particulier parce que chaque itération crée également un nouvel objet de connexion. En fonction de votre schéma/rdbms, il existe généralement une méthode à une seule requête pour extraire un ensemble d'enregistrements liés hiérarchiquement.