Har en rekursiv funktion som hämtar barnen till en node. Marcus, Det där med DataSet relationer är lite överkurs för mig just nu tror jag. Marucs, Problemet för mig är att jag inte lyckas lösa en sql-sats som plockar ut alla dessa noder. Marcus, ok, nu fattar jag vad du menar!Är detta en OK lösning?
Skickar in NodeID, en ArrayList som fylls med barnens ID. Denna ArrayList retuneras.
Har ett db objekt som skapar databaskoppling och har metod för att retunera ett command objekt.
Det jag skulle vilja veta är om detta är en bra/ok lösning prestandamässig. Hur gör jag annars?
Skulle vilja ha lite kommentarer om hur jag gör med db koppling vid varje iteration, ska man skicka runt denna eller vad är bäst?
Dim myList As New ArrayList()
myList = myNode.getUserNodeList(101, myList)
'Hämtar barn till denna node. Retunerar ArrayList
Public Function getUserNodeList(ByVal NodeID As Int32, ByRef List As ArrayList) As ArrayList
Dim db As New database()
Dim fldID, i As Int16
Dim myDataAdapter As New OleDbDataAdapter()
Dim myDataSet As New DataSet()
Dim myDataRow As DataRow
db.Init_DB()
SQL = "SELECT id FROM nodes WHERE parent_id = " & NodeID & " ORDER BY parent_id ASC"
myDataAdapter.SelectCommand = db.getCommand(SQL)
myDataAdapter.Fill(myDataSet, "Nodes")
myDataAdapter.Dispose()
db.Destroy_DB()
db = Nothing
myDataAdapter = Nothing
For Each myDataRow In myDataSet.Tables("Nodes").Rows
List.Add(myDataRow("ID").ToString())
Call getUserNodeList(CInt(myDataRow("ID").ToString()), List)
Next
myDataSet = Nothing
myDataRow = Nothing
Return List
End FunctionSv: Är detta en OK lösning?
Kollade inte riktigt igenom hela utan såg direkt en sak som du måste åtgärda - du kan (ska/bör) inte öppna en connection till din databas och köra ett nytt query varje "varv" i rekursionen. Se till att göra <b>ett</b> query där du hämtar ner alla Node information. Den informationen bearbetar du sedan rekursivt.
Du kan anväven använda dig av relations egenskaperna i ett <b>DataSet</b> för att underlätta berarbetningen av dina noder. Men som sagt, inte öppna en connection hela tiden även om connection pooling underlättar prestandamässigt men det gör inte dina queryes som du kör hela tiden.Sv: Är detta en OK lösning?
Ändrade lite i koden, öppnar databaskoplling innan funktionsanrop och skickader sedan med kopplingen till min funktion. Borde väl bli något bättre.
Tack!Sv: Är detta en OK lösning?
Saken är att det inte finns någon fördel med att <b>hela tiden</b> anropa databasen. Gör en select-sats som vaäljer ut <b>alla</b> noder ditt ditt <b>DataSet</b> sen kan du bearbeta informationen i detta <i>lokalt</b> eftersom det är som ett disconnected recordset. Hämta informationen en gång, bearbeta den i oändligheten.Sv: Är detta en OK lösning?
Denna tar ju endast en nivå ner i trädet, jag vet ju aldrig hur många nivåer som finns.
Använder en Access db, vet ej om det går att göra en SP med någon loop i eller linknande i ACCESS.
SELECT *
FROM nodes n1
INNER JOIN nodes n2 ON n1.id = n2.parent_id
WHERE n1.id = 101
Tack ändå!Sv: Är detta en OK lösning?
Men om du plockar bort din <b>WHERE</b>-sats då? Den gör juh ett urval på datamängden och då är det klart att inte all information returneras? =)Sv: Är detta en OK lösning?
Ska genast testa med ett DataSet.
Tack igen.