2010-05-05 1 views
0

Я не сделал какой-либо классический ASP в течение нескольких лет и теперь пытаюсь вернуться к нему с C#, это невозможно! У меня есть рекурсивная функция, которая очень просто должна запрашивать базу данных на основе значения, переданного функции, и как только функция перестала называть себя, она возвращает набор записей .... однако im получает старую ошибку «80020009» , Я объявил набор записей вне функции.Классическая ASP Рекурсивная функция

Cany Кто-нибудь видит ошибку в моих путях?

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 

Любая помощь будет принята с благодарностью.

Привет, Al

+0

Ваш код уязвим для SQL-инъекций –

ответ

2

Существует один экземпляр objRsTmp в глобальном масштабе, то есть его разделяется между каждым buildList() в стеке; поэтому всякий раз, когда вы возвращаетесь в buildList() и вызываете objRsTmp.Open(), вы вызываете предыдущий buildList() в стек, чтобы использовать новый objRsTmp.

Я не думаю, что это то, что ваш после, когда вы зацикливаете его строки, как если бы каждый buildList() имел свой собственный набор результатов.

Для этого вам нужно сделать локальный набор записей ... однако это очень дорогой способ сделать это, особенно потому, что каждая итерация также создает новый объект соединения.

В зависимости от вашей схемы/rdbms обычно существует метод запроса с одним запросом набора иерархически связанных записей.