2010-05-05 99 views
0

我沒有做任何經典的ASP幾年,現在試圖從C#中回到它是推動不可能!我有一個遞歸函數,它非常簡單地應該根據傳遞給函數的值來查詢數據庫,一旦函數已經停止調用它自己,它將返回記錄集....但是,即時獲取舊錯誤'80020009'消息。我已經聲明瞭該函數之外的記錄集。經典的ASP遞歸函數

任何人都可以在我的方式看到錯誤?

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 

任何援助將不勝感激。

問候, 鋁

+0

您的代碼易受sql注入 – 2011-11-30 14:30:36

回答

2

有的objRsTmp在全球範圍內的單個實例,這意味着它的每一個buildList()堆棧上之間共享;因此無論何時您遞歸到buildList()並致電objRsTmp.Open()您導致堆棧上的前buildList()使用新的objRsTmp

我不認爲這是你的後循環行,就好像每個buildList()都有自己的一套結果。

要做到這一點,你將不得不使記錄集本地化......但是,這是一個非常昂貴的方法來做到這一點,特別是因爲每個迭代也創建一個新的連接對象。

根據您的schema/rdbms,通常有一種單一查詢方式來拉取一組與層次相關的記錄。