Avatar billede damon Nybegynder
21. maj 2007 - 10:29 Der er 8 kommentarer

Rekursivt Datase funktion

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..

nogen der kan hjælpe?
Avatar billede Spotgun Seniormester
21. maj 2007 - 11:07 #1
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.
Avatar billede damon Nybegynder
21. maj 2007 - 11:19 #2
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?
Avatar billede Spotgun Seniormester
21. maj 2007 - 11:40 #3
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.
Avatar billede damon Nybegynder
21. maj 2007 - 13:46 #4
Jep det virkede, det virkede bare umiddelbart utroligt tungt, derfor jeg kastede forbindelsen med i kaldet...

læg et svar :)
Avatar billede Spotgun Seniormester
21. maj 2007 - 13:53 #5
Værsgo :)
Avatar billede Spotgun Seniormester
21. maj 2007 - 15:11 #6
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! :)
Avatar billede Syska Mester
21. maj 2007 - 22:08 #7
Hej,

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 ....

Virker godt og kræver kun 1 db kald ...

// ouT
Avatar billede damon Nybegynder
22. maj 2007 - 08:10 #8
Det prøver jeg helt klart at kigge på :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester