Jeg har et problem med mit database kald i en rekursiv funktion..
Prøver at indsætte noget data i et treeview, og kalder - i min funktion - databasen med en select og bruger den data til at skabe mit hieraki i Treeview i min win32 program..
min rekursive funktion ser således ud:
public void ShowTree( string FiNr, TreeNode vParent, SqlConnection conn) {
SqlCommand cmd = new SqlCommand("select * from ss.si where FiNr in (select bfinr from ss.ss where FiNr='" + FiNr + "') order by finr asc", conn); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { TreeNode vChild = new TreeNode(); vChild.Text = rdr["Firma"].ToString(); vChild.Tag = rdr["FiNr"].ToString(); ShowTree(rdr["FiNr"].ToString(), vChild, conn); }
treeView1.Nodes.Add(vParent);
}
problemet kommer når jeg kalder min funktion rekursivt, jeg får af vide at der allerede er associeret en datareader med det command.. og får ikke lov til at gøre det igen..
Jeg kunne forestille mig at du enten skal lukke din SqlConnection inden du kalder ShowTree igen, eller også skal den fjernes som parameter, og så skal du åbne en ny SqlConnection inde i selve ShowTree metoden, hver gang den køres.
Jeg har en idé om at fejlen kommer, fordi din Connection er i brug med den igangværende instans SqlCommand/SqlDataReader i den første kørsel af ShowTree.
Problemet er at hvis min første node indeholder et barn, dvs den kommer til at kalde min rekursive funktion igen, og jeg lukker forbindelsen, for at genåbne den, vil jeg miste alle de efterfølgende børn?
Så må du bruge mit andet forslag, og droppe din SqlConnection som et parameter, og oprette en ny SqlConnection hver gang funktionen køres. I det tilfælde vil du ikke miste noget - det kan dog i visse tilfælde gi' en fandens masse åbne forbindelser til databasen, afhængig af hvor dyb en rekursion du når ud i.
Du kan også godt sende din connection med, og genbruge den, så skal du dog væk fra din DataReader, og måske kigge på en DataTable/DataSet i stedet for.
Det kan godt være det performer lidt bedre, hvis du kan spare en masse samtidige DB-forbindelser. Det var da værd at teste i hvert fald! :)
Hvis database hænger logisk sammen ... altså at et ID altid pejer på et andet ... kan du henete det hele ned i et DataSet og så lave relation mellem de forskellige columns ... og så hente child rows ud .... på de enkelte rækker ....
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.